У меня есть два объекта NSData, data1 и data2, и я хотел бы сделать бит-мудрый XOR и сохранить результат в третьем объекте NSData, xorData.Как сделать бит XOR по NSData в Objective-C?
Первое, что я попытался было это:
*data1.bytes^*data2.bytes;
но это дало ошибку:
инвалидных операндов бинарного выражения ('Const ничтожной' и 'Const пустоты')
Итак, я попытался написать функцию, которая будет извлекать байты данных в массив целых чисел, выполнять 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?
Если вы получаете массивы байтов из объектов NSData, почему вы объявляете им быть 'ИНТ 'массивы ??? (И это только одна из ваших проблем.) –
FYI, '8070450532247943280' =' 0x7000000000003870'. И '8070450532247943168' =' 0x7000000000003800'. Так что xor выглядит хорошо для меня. Проблема, как говорит Hot Licks, заключается в том, что вы используете указатели 'int *' и получаете 64-битные номера. Каковы основные данные? Есть ли причина, по которой вы не используете что-то более представительное из байта (например, 'uint8_t')? Что именно вы пытаетесь сделать? Вы не показываете нам, что находится в объектах 'NSData', поэтому нам сложно предложить адвоката. – Rob