如何在Objective-C中对NSData进行逐位XOR处理?

时间:2015-04-28 01:45:21

标签: objective-c xcode5 nsdata endianness xor

我有两个NSData对象,data1和data2,我想做一个按位XOR并将结果存储在第三个NSData对象xorData中。

我尝试的第一件事是:

*data1.bytes^*data2.bytes;

但它出现了错误:

  

二进制表达式的无效操作数('const void'和'const void')

所以我尝试编写一个函数,将数据的字节提取为整数数组,对整数执行xor,然后将结果保存回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]);

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

  

主题1:EXC_BAD_ACCESS(代码= 1,地址= 0xa08ad539)

有没有更简单的方法来做xor?如果没有,我该如何解决endian问题?

2 个答案:

答案 0 :(得分:5)

转换为int然后归档NSArray NSNumber,肯定不会创建您正在寻找的结果。您希望有一些可变的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;
}

答案 1 :(得分:1)

     UIImage* flippedImage = [UIImage imageWithCGImage:imgView.image.CGImage
                                                scale:imgView.image.scale
                                          orientation:UIImageOrientationUpMirrored];