1

我有 1 个十六进制文件,我想读取这个文件并将其解析为 NSString。我使用此代码读取十六进制文件,但它仅在控制台中打印十六进制代码:

 -(void)readHexfile
{
    NSData *data = [NSData dataWithContentsOfFile:@"path file"];
    NSLog(@"Patch File: %@",data);
}

你有什么建议吗?提前致谢

4

3 回答 3

1

使用stringWithContentsOfFile:encoding:error:而不是将dataWithContentsOfFile其读取为 NSString。

于 2013-08-06T07:32:50.273 回答
0

您会使用 a NSScanner(首先使用将您的数据转换为字符串[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding](假设您的文本是纯 ASCII 或 UTF-8)或直接使用+[NSString stringWithContentsOfFile:encoding:error:])读取它。另请参阅有关如何使用扫描仪的字符串编程指南

编辑:所以看起来你想读取一个带有空终止字符串的文件。一种幼稚且低效的方法是:

NSData *data = [NSData dataWithContentsOfFile:@"file.path"];
NSMutableArray *strings = [NSMutableArray array];
const char *rawData = [data bytes];
NSUInteger dataLength = [data length];
NSMutableData *currentString = [NSMutableData data];

for (NSUInteger i = 0; i < dataLength; i++) {
    if (rawData[i] == 0) {
       if ([currentString length] > 0) {
           [strings addObject:[[[NSString alloc] initWithData:currentString encoding:NSUTF8StringEncoding] autorelease]];
       }
       [currentString release];
       currentString = [NSMutableData data];
    } else {
       [currentString appendBytes:&rawData[i] length:1];
    }
}

// Handle the last string if it wasn't null-terminated.
if ([currentString length] > 0) {
   [strings addObject:[[[NSString alloc] initWithData:currentString encoding:NSUTF8StringEncoding] autorelease]];
}

// "strings" now is a list of strings.
于 2013-08-06T07:33:52.650 回答
0

没有像“十六进制文件”这样的东西。十六进制或十六进制是一种数字系统,非常适合以某种适合人类的方式以八位字节(8 位字节)显示二进制数据。

您当前所做的是在控制台上以十六进制显示 NSData 对象的描述。

一些快速而肮脏的黑客可能只是使用 NSData 的描述。

NSString *hexString = [data description];

这将产生一些开销,您可以使用字符串操作方法去除这些开销。有一些更聪明的方法可能需要更多的工作。

相反,如果您对十六进制表示不感兴趣,则使用stringWithContentsOfFile将文件直接读入 NSString 对象。然后,您可以根据文件的实际编码方式应用各种编码。

于 2013-08-06T07:38:14.797 回答