我试图通过查看前四个字节来检测给定文件是否是ZIP文件.这是在一个iOS应用程序,所以文件句柄的东西是由Cocoa框架处理,但实际的字节比较的东西是直接C,我真的不知道.
unsigned char aBuffer[4];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
NSData *data = [fileHandle readDataOfLength:4];
[data getBytes:aBuffer];
if (aBuffer[0] == 0x50 && aBuffer[1] == 0x4b && aBuffer[2] == 0x03 && aBuffer[3] == 0x04) {
archiveType = ARCHIVE_TYPE_ZIP;
}
Run Code Online (Sandbox Code Playgroud)
它起作用但是笨拙地打击我.有没有更好的方法来比较这4个字节?(是的,我知道它需要更多错误检查.)
你可以使用memcmp.就像strcmp,但是对于记忆.
if (memcmp([data bytes],"PK\3\4",4) == 0) {
// success
}
Run Code Online (Sandbox Code Playgroud)
也就是说,既然你正在使用Objective-C,你应该寻找比C更高级的实现.我建议用你期望的数据构建一个NSData,然后使用[data isEqual: expectedData].
NSData *expectedHeader = [NSData dataWithBytes: "PK\3\4" length: 4];
if ([expectedHeader isEqual: data]) {
// success
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用isEqualToData:if isEqual:.我更喜欢短标识符,但是isEqualToData:当暴露于不匹配的类型时更有效并抛出.
你现在非常接近你的意图,而不是实际的机制.
@jsd澄清说他正在寻找程序员效率,而不是运行时效率.但对于将来阅读本文的人来说:忘记运行时效率.你多久检查一次拉链头?相反,担心代码有多简单,以及它可能出错的方式有多少.并且在适合时总是支持更高级别的抽象.