我有 1 个十六进制文件,我想读取这个文件并将其解析为 NSString。我使用此代码读取十六进制文件,但它仅在控制台中打印十六进制代码:
-(void)readHexfile
{
NSData *data = [NSData dataWithContentsOfFile:@"path file"];
NSLog(@"Patch File: %@",data);
}
你有什么建议吗?提前致谢
我有 1 个十六进制文件,我想读取这个文件并将其解析为 NSString。我使用此代码读取十六进制文件,但它仅在控制台中打印十六进制代码:
-(void)readHexfile
{
NSData *data = [NSData dataWithContentsOfFile:@"path file"];
NSLog(@"Patch File: %@",data);
}
你有什么建议吗?提前致谢
使用stringWithContentsOfFile:encoding:error:
而不是将dataWithContentsOfFile
其读取为 NSString。
您会使用 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.
没有像“十六进制文件”这样的东西。十六进制或十六进制是一种数字系统,非常适合以某种适合人类的方式以八位字节(8 位字节)显示二进制数据。
您当前所做的是在控制台上以十六进制显示 NSData 对象的描述。
一些快速而肮脏的黑客可能只是使用 NSData 的描述。
NSString *hexString = [data description];
这将产生一些开销,您可以使用字符串操作方法去除这些开销。有一些更聪明的方法可能需要更多的工作。
相反,如果您对十六进制表示不感兴趣,则使用stringWithContentsOfFile
将文件直接读入 NSString 对象。然后,您可以根据文件的实际编码方式应用各种编码。