如何在Objective-C中对NSData执行逐位异或



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

我尝试的第一件事是:

*data1.bytes^*data2.bytes;

但它给出了一个错误:

二进制表达式('const void'和'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]);

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

线程1:EXC_BAD_ACCESS(代码=1,地址=0xa08ad539)

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

转换为int然后归档NSNumberNSArray肯定不会产生您想要的结果。您需要一些可变的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];
}

最新更新