我有两个 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
然后归档 NSArray
的 NSNumber
s 绝对不会创建您正在寻找的结果。你会想要一些可变的 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;
}
关于objective-c - 如何在 Objective-C 中对 NSData 进行按位异或?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908884/