【问题标题】:Differences in File Characters between iOS and OSXiOS 和 OSX 文件字符的差异
【发布时间】:2013-01-17 14:33:02
【问题描述】:

我有代码正在尝试在 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;
}

【问题讨论】:

  • 该 PNG 是作为应用程序的一部分下载或复制的吗?你说它发生在其他文件类型上。纯文本文件会发生这种情况吗?
  • 有趣的问题。我对其进行了编辑以符合一般的堆栈溢出样式,并提供一些我认为可以帮助您获得更好答案的标签。如果我歪曲了某些内容,我深表歉意。
  • 感谢格式化帮助。发布的第一个问题....是的,该文件是应用程序包的一部分(无论如何都用于这些测试),但我在进行比较之前将其从包中复制到 Documents 中,因此我可以更好地匹配 OSX 端。没有尝试过文本文件,因为我们使用的大多数文件都是二进制文件。

标签: ios macos file io nsfilemanager


【解决方案1】:

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

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

【讨论】:

  • 太棒了!已重新检查并重建项目。删除压缩本身不起作用(稍后将重新检查),但使用捆绑包中具有不同扩展名的测试文件第一次起作用。只是运气不好,我选择了一个 PNG 作为测试文件 :-) 非常感谢!
  • 通过构建设置删除压缩可能需要一个干净的构建并首先从设备或 sim 中删除应用程序。否则旧版本可能不会被覆盖。
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 2017-04-04
  • 2013-03-18
  • 2012-01-11
  • 2011-03-14
相关资源
最近更新 更多