我有这个文件,我需要读取第一个字节来检查信息。 我不需要加载整个文件,只需要开头.. C中的代码或多或少是以下内容。这是一个很大的代码,所以我在这里写了基本功能。
现在我想让它成为100%Objective-C,但我找不到合适的方法。
FILE *f;
char *buf;
f = fopen ("/Users/foo/Desktop/theFile.fil", "rb");
if(f) {
fseek(f , 0 , SEEK_END);
size = ftell(f);
rewind (f);
buf = (char*) malloc (sizeof(char)*size);
switch( ntohl(*(uint32 *)buf) ) {
case 0x28BA61CE:
case 0x28BA4E50:
NSLog(@"Message");
break;
}
fclose(f);
free (buf);
我接下来最接近的是:
NSData *test = [[NSData alloc] initWithContentsOfFile:filePath];
这让我得到了所有二进制文件,但无论如何,我卡住了。最好尝试从头开始......
任何帮助表示赞赏!
答案 0 :(得分:4)
嗯,有效的C代码是有效的Objective-C代码。所以这已经在Objective-C中了。
你的实际目标是什么?你想用这个文件做什么?是否有理由不能使用NSData
?
答案 1 :(得分:1)
C代码已经是Obj-C。只使用你已经在做的事情是完全合理的。但是如果您使用Obj-C对象来执行此操作,那么您需要查看NSInputStream。
答案 2 :(得分:0)
我接下来最接近的是:
NSData *test = [[NSData alloc] initWithContentsOfFile:filePath];
这让我得到了所有二进制文件,但无论如何,我卡住了。
目前还不清楚你被困在哪里,因为这是(最简单的)正确的方式来读取Cocoa中的一个大问题。您已成功读取该文件;没有什么可以做的。
如果您要继续switch
语句,则指向它所读取的字节的指针为[test bytes]
。这是您要分配给buf
的指针。请参阅the NSData documentation。
答案 3 :(得分:0)
嗯..我把它整理出来了......接下来做了什么。
干杯并感谢您的帮助!
NSString *filePath = [[NSString alloc] initWithFormat:@"/Users/foo/Desktop/theFile.fil"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
NSNumber *size = [[NSNumber alloc] initWithUnsignedLong:len/2^20];
NSLog(@"%@", size);
switch( ntohl(*(uint32 *)byteData) ) {
case 0x28BA61CE:
case 0x28BA4E50:
NSLog(@"Message");
break;
}
[size release];
[filePath release];