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

时间:2013-02-02 09:39:15

标签: ios macos file io nsfilemanager

我有代码我尝试在OSX和iOS上工作并遇到文件读取问题。我试图在字节级别进行文件比较。

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

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

对于文件中的相同输入偏移,例如 NSString *definedOffsets = @"49510,37559,13642,49652,19950,21652"; 当我在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;
}

1 个答案:

答案 0 :(得分:1)

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

尝试重命名您的图片以使用“.dat”扩展程序,看看您是否获得了不同的结果。您还可以使用“压缩PNG文件”构建设置在目标或项目级别禁用此功能:

enter image description here