如何替换cocoa中的第一个字节

时间:2013-08-07 03:49:37

标签: objective-c macos cocoa nsdata

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

2 个答案:

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