我有一个十六进制字节的文件。我使用NSData读取此文件,然后将NSdata转换为int。现在我想将文件中的第一个字节替换为其他值。示例:转换为int时的第一个字节是49,我想将其更改为48然后将其替换为文件。我怎样才能做到这一点?这是我的代码:
NSData *data = [NSData dataWithContentsOfFile:@"file"];
NSLog(@"Patch File: %@",data);
NSData *theData = [NSData dataWithData:[data subdataWithRange:NSMakeRange(0,1)]];
int value = *(int*)([theData bytes]);
NSLog(@"%d",value);
if( value == 49)
value = 48;
NSLog(@"%d",value);
在代码上方运行时,显示:
<31414142 42434344 44454546 4654502d 4c494e4b 2d544553 54000000 00000000 00000000>
我想将第一个字节替换为0x02。我怎样才能做到这一点?非常感谢
答案 0 :(得分:3)
“NSMutableData
”有一个非常方便的功能"replaceBytesInRange: withBytes:
",可用于替换事物。
所以修改你的代码看起来像这样:
NSMutableData *data = [NSMutableData dataWithContentsOfFile:@"test"];
NSLog(@"Patch File: %@",data);
int value;
[data getBytes: &value range: NSMakeRange(0,1)];
NSLog(@"%d",value);
if( value == 49)
value = 48;
[data replaceBytesInRange: NSMakeRange(0,1) withBytes: &value];
NSLog(@"%d",value);
NSError * error = nil;
BOOL success = [data writeToFile: @"file" options: NSDataWritingAtomic error: &error];
if(success == NO)
{
NSLog( @"error writing data out -- %@", [error localizedDescription]);
}
答案 1 :(得分:1)
如果只替换一个字节,则无需使用replaceBytesInRange:
。
NSMutableData *data = [NSMutableData dataWithContentsOfFile:@"test"];
char *bytes = [data mutableBytes];
if (bytes[0] == 49)
bytes[0] = 48;
NSError *error = nil;
if (![data writeToFile:@"file" options:NSDataWritingAtomic error:&error])
NSLog(@"Error occurred: %@", error);
如果您尝试从文件中读取int
的二进制表示,则需要使用:
int value;
[data getBytes:&value length:sizeof value];
if (value == 1234)
value = 4321;
[data replaceBytesInRange:NSMakeRange(0, sizeof value) withBytes:&value];