Objective c 将C转换为Obj-C文件读取代码

Objective c 将C转换为Obj-C文件读取代码,objective-c,cocoa,binary,Objective C,Cocoa,Binary,我有这个文件,我需要读取第一个字节来检查信息。 我不需要加载整个文件,只需加载开始部分。。 C语言中的代码大致如下。这是一个很大的代码,所以我只在这里编写了基本功能 现在我想让它100%客观化,但我找不到一种方法来正确地做到这一点 FILE *f; char *buf; f = fopen ("/Users/foo/Desktop/theFile.fil", "rb"); if(f) { fseek(f , 0 , SEEK_END); size = ftell(f); rewind (f)

我有这个文件,我需要读取第一个字节来检查信息。 我不需要加载整个文件,只需加载开始部分。。 C语言中的代码大致如下。这是一个很大的代码,所以我只在这里编写了基本功能

现在我想让它100%客观化,但我找不到一种方法来正确地做到这一点

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];
NSData *test = [[NSData alloc] initWithContentsOfFile:filePath];
这让我得到了所有的二进制文件,但无论如何,我被卡住了。最好从头开始


感谢您的帮助

有效的C代码就是有效的目标C代码。这已经在Objective-C中了


你的实际目标是什么?你想用这个文件做什么?有什么原因不能使用NSData吗?

好吧,有效的C代码就是有效的Objective-C代码。这已经在Objective-C中了


你的实际目标是什么?你想用这个文件做什么?有什么原因不能使用NSData吗?

C代码已经是Obj-C。只使用您已经在做的事情是完全合理的。但是,如果您死心塌地地想使用Obj-C对象来执行此操作,您需要看一看。

C代码已经是Obj-C了。只使用您已经在做的事情是完全合理的。但是,如果您死心塌地地使用Obj-C对象来执行此操作,那么您需要看看

我最接近这一点的是:

NSData *test = [[NSData alloc] initWithContentsOfFile:filePath];
NSData *test = [[NSData alloc] initWithContentsOfFile:filePath];
这让我得到了所有的二进制文件,但无论如何,我被卡住了

现在还不清楚你被困在哪里,因为这是用可可豆一大口地读文件的最(最简单)正确方法。您已成功读取该文件;没什么可做的了

如果要继续执行
开关
语句,则指向它读取的字节的指针是
[测试字节]
。这是您要分配给
buf
的指针。看

我最接近这一点的是:

NSData *test = [[NSData alloc] initWithContentsOfFile:filePath];
NSData *test = [[NSData alloc] initWithContentsOfFile:filePath];
这让我得到了所有的二进制文件,但无论如何,我被卡住了

现在还不清楚你被困在哪里,因为这是用可可豆一大口地读文件的最(最简单)正确方法。您已成功读取该文件;没什么可做的了


如果要继续执行
开关
语句,则指向它读取的字节的指针是
[测试字节]
。这是您要分配给
buf
的指针。请参阅。

好的。。我已经解决了。。然后做了接下来的事情

干杯,谢谢你的帮助

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];

嗯。。我已经解决了。。然后做了接下来的事情

干杯,谢谢你的帮助

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];

为什么不使用内置方式<代码>+[NSString stringWithContentsOfFile]例如,您的代码一开始看起来是错误的。您正在
malloc
'ing一个缓冲区,其大小与文件的整个大小相同。。。然后在没有读取任何数据的情况下检查缓冲区。如果您声明的目标是只读取文件的开头,则不需要那么大的缓冲区。@KevinBallard这只是一个临时解决方案。我的目标是使用Obj-C,因此我认为在使用Obj-C时,我可以将精力放在内存和缓冲区细节上,而不是用C编写最好的代码来替换它。。无论如何,这只是为了让我知道如何比较switch语句中的值。我已经有了一个希望使用的十六进制值列表。@Giancarlomario:我不是说它不是“最好的代码”,我是说你没有阅读该文件。为什么不使用内置方式<代码>+[NSString stringWithContentsOfFile]例如,您的代码一开始看起来是错误的。您正在
malloc
'ing一个缓冲区,其大小与文件的整个大小相同。。。然后在没有读取任何数据的情况下检查缓冲区。如果您声明的目标是只读取文件的开头,则不需要那么大的缓冲区。@KevinBallard这只是一个临时解决方案。我的目标是使用Obj-C,因此我认为在使用Obj-C时,我可以将精力放在内存和缓冲区细节上,而不是用C编写最好的代码来替换它。。无论如何,这只是为了让我知道如何比较switch语句中的值。我已经有了一个希望使用的十六进制值列表。@Giancarlomario:我不是说它不是“最好的代码”,我是说你没有读取文件。我想识别文件中的数据。十六进制中的前8个字节是我已经拥有的列表的一部分。但是,对于初学者来说,当我尝试Obj-C方法时,十六进制变为反转。第二,我不希望将所有文件都存储在内存中。我只希望使用Objective-C来保持我的项目的同质性和良好的文档记录。如果可以实现,我更喜欢Obj-C。@Giancarlomario:不,当你尝试纯C代码时,“十六进制变为反向”,因为该代码包含一个函数调用(to
ntohl
)来交换前四个字节。十六进制不会与Cocoa one liner“反转”,因为它中没有任何东西可以进行这种交换。正如我在回答中所说,您可以在读取代码之后使用完全相同的
开关,包括字节交换。我想识别文件中的数据。十六进制中的前8个字节是我已经拥有的列表的一部分。但是,对于初学者来说,当我尝试Obj-C方法时,十六进制变为反转。第二,我不希望将所有文件都存储在内存中。我只希望使用Objective-C来保持我的项目的同质性和良好的文档记录。如果可以实现,我更喜欢Obj-C。@Giancarlomario:不,当你尝试纯C代码时,“十六进制变为反向”,因为该代码包含一个函数调用(to
ntohl
)来交换前四个字节。十六进制不会与Cocoa one liner“反转”,因为它中没有任何东西可以进行这种交换。正如我在回答中所说,在读取代码之后,可以使用完全相同的
开关,包括字节交换。我被卡住了,因为我无法使用Objective-C在开关语句中生成相同的数据。我不知道