如何对 Objective-C 中的 NSData 进行按位异或?

How do I do a bit-wise XOR on NSData in Objective-C?

我有两个 NSData 对象,data1 和 data2,我想进行按位异或并将结果存储在第三个 NSData 对象 xorData 中。

我尝试的第一件事是:

*data1.bytes^*data2.bytes;

但它给出了一个错误:

Invalid operands to binary expression ('const void' and 'const void')

所以我尝试编写一个函数,将数据的字节提取到整数数组中,对整数执行异或运算,然后将结果保存回 NSData 对象。该函数如下所示:

+(NSData *) DataXOR1:(NSData *) data1
DataXOR2:(NSData *)data2{
    const int *data1Bytes = [data1 bytes];
    const int *data2Bytes = [data2 bytes];
    NSMutableArray *xorBytes = [[NSMutableArray alloc] init ];
    for (int i = 0; i < data1.length;i++){
         [xorBytes addObject:[NSNumber numberWithInt:(data1Bytes[i]^data2Bytes[i])]];
    }
    NSData *xorData = [NSKeyedArchiver archivedDataWithRootObject:xorBytes];
    return xorData;
}

这运行了,但给出了错误的答案。当我在两个简单的数据(data1 = 0x7038 和 data2 = 0x0038)上测试它并使用 NSLog 输出值时,我得到:

data1Bytes[0] = 8070450532247943280
data2Bytes[0] = 8070450532247943168
data1Bytes[0]^data2Bytes[0] = 112
data1Bytes[1] = 10376302331560798334
data2Bytes[1] = 10376302331560798334
data1Bytes[1]^data2Bytes[1] = 0

这让我有点困惑,因为 dataXBytes 数组中的值完全错误,但它们异或到正确的值! (0x70 ^ 0x00 = 0x70 = 112)

我认为这可能是字节序问题,但是当我将 data1Bytes 的初始化更改为:

const int *data1Bytes = CFSwapInt32BigToHost([data1 bytes]);

它在尝试访问它时遇到错误,说:

Thread 1: EXC_BAD_ACCESS(code=1, address = 0xa08ad539)

有没有更简单的异或方法?如果没有,我该如何解决字节序问题?

转换为 int 然后归档 NSArrayNSNumber 绝对不会产生您正在寻找的结果。您将需要一些可变的 NSData ,您可以将各个字节附加到其中,例如

+(NSData *) DataXOR1:(NSData *) data1
            DataXOR2:(NSData *)data2{
    const char *data1Bytes = [data1 bytes];
    const char *data2Bytes = [data2 bytes];
    // Mutable data that individual xor'd bytes will be added to
    NSMutableData *xorData = [[NSMutableData alloc] init];
    for (int i = 0; i < data1.length; i++){
        const char xorByte = data1Bytes[i] ^ data2Bytes[i];
        [xorData appendBytes:&xorByte length:1];
    }
    return xorData;
}
+ (NSData *) xorData:(NSData *)data1 with:(NSData *)data2
{
    // make data1 smaller
    if (data1.length > data2.length) {
        NSData *t = data1;
        data1 = data2;
        data2 = t;
    }

    char *xor = (char *) malloc(data2.length * sizeof(char));
    char * data1Bytes = (char *) data1.bytes;
    char * data2Bytes = (char *) data2.bytes;

    for (int i = 0; i <data1.length; i++)
    {
        xor[i] = data1Bytes[i] ^ data2Bytes[i];
    }

    NSMutableData *data = [[[NSMutableData alloc] initWithBytes:xor length:data1.length] autorelease];
    [data appendData:[data2 subdataWithRange:NSMakeRange(data1.length, data2.length - data1.length)]];
    free(xor);
    return [NSData dataWithData:data];
}