Проблема, с которой вы столкнулись, связана с арифметикой указателя c в этой строке:
*(encryption+i) = ascii[i] ^ num[i];
Теперь, поскольку переменная encryption
определена как int*
, добавление, i
будет автоматически умножено на sizeof(int)
компилятором. Поэтому код, подобный следующему, будет работать как положено:
int array[4] = {1, 2, 3, 4};
int *ptr = &array[0];
*(ptr+2) = 5; // Will actually add "2 * sizeof(int)" to "ptr" - referencing THIRD element of array
Что вы можете сделать, это объявить encryption
как указатель на unsigned char
:
unsigned char* encryption = (unsigned char*)(&result);
Не стесняйтесь просить дальнейших разъяснений и / или объяснений; Вы также можете найти Pointer Arithmeti c раздел этого учебного пособия полезным.
РЕДАКТИРОВАТЬ: лучший / более безопасный способ добиться шифрования - использовать бит оператор -shift (<<
) для перемещения элементов массива символов в соответствующие байты переменной result
, затем XOR
, что (одним падением sw oop) с аргументом x
. Итак, как вы указали формат Big-Endian , вы можете использовать такой код:
unsigned int EncryptXOR(unsigned int x, unsigned char key[]) {
unsigned int mask = (key[0] << 24) | (key[1] << 16) | (key[2] << 8) | key[3];
return x ^ mask;
}