iOS和OSX之间的文件字符差异

iOS和OSX之间的文件字符差异,ios,macos,file,io,nsfilemanager,Ios,Macos,File,Io,Nsfilemanager,我有一些代码试图在OSX和iOS上运行,但在文件读取方面遇到了问题。我试图在字节级别进行文件比较 但是,使用相同的PNG图像文件作为测试(其他文件类型也有同样的问题),当我读取图像文件中相同物理偏移量的字符时,返回的字符不同,这取决于我是在iOS物理设备(iPhone)上还是在Mac上(这类模拟器也是如此) 我编写了一些代码来读取同一文件中相同偏移量的字符串,以验证这一点。使用下面的代码,我从同一个引用文件中一次读取一个字节来创建一个字符串,然后将该字符串与另一个平台上上次运行的已知值进行比较

我有一些代码试图在OSX和iOS上运行,但在文件读取方面遇到了问题。我试图在字节级别进行文件比较

但是,使用相同的PNG图像文件作为测试(其他文件类型也有同样的问题),当我读取图像文件中相同物理偏移量的字符时,返回的字符不同,这取决于我是在iOS物理设备(iPhone)上还是在Mac上(这类模拟器也是如此)

我编写了一些代码来读取同一文件中相同偏移量的字符串,以验证这一点。使用下面的代码,我从同一个引用文件中一次读取一个字节来创建一个字符串,然后将该字符串与另一个平台上上次运行的已知值进行比较

对于文件中相同的输入偏移量,例如。
NSString*definedOffsets=@“495103755913642496521995021652”
当我在OSX(或iPhone模拟器)上运行代码时,与在物理iPhone设备上运行代码时,我得到的结果不同,即使输入文件是相同的图像文件

有人能解释一下为什么会这样,以及我是如何对其进行编码的吗

- (NSString *) readCharacters:(NSString *) dataline fromSource:(NSString *)datasource
{
  NSString *f=nil;

  if ([[NSFileManager defaultManager] fileExistsAtPath:datasource])
  {
    NSError *error=nil;
    //-- Read the image file into an NSData
    NSData *databuff = [NSData dataWithContentsOfFile:datasource options:NSDataReadingUncached error:&error];

    //-- Read the file offsets to compare
    NSArray *d = [dataline componentsSeparatedByString:@","];

    //-- Print Logs of inputs
    NSLog(@"[readCharacters Offsets]: %@",dataline);
#ifdef IPHONE_PLATFORM
    NSLog(@"[readCharacters Offset Count]: %d", d.count);
#else
    NSLog(@"[readCharacters Offset Count]: %ld", (unsigned long)d.count);
#endif

    //-- Get the characters from file
    int8_t oneByte;
    int knum;
    char na[65];
    for (int i=0;i<64;i++)
    {
      knum = [[d objectAtIndex:i] intValue];
      [databuff getBytes:&oneByte range:NSMakeRange(knum, 1)];
      na[i] = oneByte;
    }
    na[64]='\0';
    f = [NSString stringWithUTF8String:na];
  }
  else{
    NSLog(@"Cant Find File");
  }

  //-- Return the String of characters read for later comparison
  NSLog(@"[Characters]: %@",f);
  return f;
}
-(NSString*)readCharacters:(NSString*)数据行fromSource:(NSString*)数据源
{
NSString*f=nil;
if([[NSFileManager defaultManager]fileExistsAtPath:datasource])
{
n错误*错误=nil;
//--将图像文件读入NSData
NSData*databuff=[NSData datawithcontentsoff文件:数据源选项:nsdatareadingucached错误:&error];
//--读取要比较的文件偏移量
NSArray*d=[数据线组件由字符串分隔:@“,”];
//--打印输入日志
NSLog(@“[readCharacters Offset]:%@”,数据行);
#ifdef IPHONE_平台
NSLog(@“[readCharacters偏移量计数]:%d”,d.Count);
#否则
NSLog(@“[readCharacters偏移量计数]:%ld”,(无符号长)d.Count);
#恩迪夫
//--从文件中获取字符
int8_t一字节;
int knum;
char-na[65];

对于(int i=0;i对于iOS应用程序,Xcode构建过程将在PNG文件上运行
pngcrush
,以针对设备的图形卡对其进行优化。这包括插入额外的PNG块,剥离zlib头和校验和,从RGB到BGR的字节交换,以及预乘以alpha值

尝试重命名图像以使用“.dat”扩展名,然后查看是否得到不同的结果。您还可以使用“压缩PNG文件”生成设置在目标或项目级别禁用此功能:


PNG是作为应用程序的一部分下载或复制的吗?你说它发生在其他文件类型中。它发生在纯文本文件中吗?有趣的问题。我编辑它是为了符合一般堆栈溢出样式,并给出一些标记,我想可能会帮助你得到更好的答案。如果我误传了什么,我道歉。谢谢你的帮助e格式帮助。发布了第一个问题……是的,该文件是应用程序包的一部分(在任何情况下,对于这些测试)但在进行比较之前,我将其从捆绑包中复制到文档中,以便更好地匹配OSX端。由于我们使用的大多数文件都是二进制文件,所以我没有尝试过文本文件。太棒了!!已经重新检查并重建了项目。删除压缩本身不起作用(稍后将重新检查),但在捆绑包中使用具有不同扩展名的测试文件首次奏效。运气不好,我选择了一个PNG作为测试文件:-)非常感谢!通过生成设置删除压缩可能需要一个干净的生成,并首先从设备或sim卡中删除应用。否则旧版本可能不会被覆盖。