objective-c - 如何在 Objective-C 中对 NSData 进行按位异或?

标签 objective-c xcode5 nsdata endianness xor

我有两个 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 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/

相关文章:

ios - StoryBoard - UITabBarController + UINavigationController - 从一个导航 Controller 跳转到另一个

ios - 如何增加声音文件(如uiimagefile)的值

ios - Objective-C - 获取本地化的周末和工作日名称?

c++ - 当我看到链接错误时,我会看到形状奇怪的符号。有什么方法可以分析它们以便我了解我的错误吗?

ios - 有没有办法设置模拟器在有限的内存上工作?

swift - Swift 中的 NSData 到 [Uint8]

ios - 有什么方法可以在不将 CIImage 转换为 UIImage 或 CGImage 的情况下将 CIImage 转换为 NSData?

ios - 将对象添加到NSMutableArray时无法识别的选择器

iOS 将 iPad 应用程序转换为通用应用程序不显示 iPhone 的 appIcon

objective-c - 如何将 NSValue 转换为 NSData 并返回?