0

我有一个十六进制字节的文件。我使用 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。我怎样才能做到这一点?非常感谢

4

2 回答 2

4

" 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]);
    }
于 2013-08-07T03:52:34.717 回答
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];
于 2013-08-07T04:34:01.413 回答