Я пытаюсь зашифровать std :: vector с помощью XTEA. Поскольку использование std :: vector приносит различные преимущества при работе с большими объемами данных, я хочу его использовать.
XTEA-Alogrithm использует два длинных знака без знака (v0 и v1), которые принимают 64 бита данных для их шифрования.
xtea_enc(unsigned char buf[], int length, unsigned char key[], unsigned char** outbuf)
/* Source http://pastebin.com/uEvZqmUj */
unsigned long v0 = *((unsigned long*)(buf+n));
unsigned long v1 = *((unsigned long*)(buf+n+4));
Моя проблема в том, что я ищу лучший способ преобразовать мой символ-символ в длинный беззнаковый указатель.
Или есть другой способ разделить вектор на 64-битные части для функции шифрования?
Понимание приходит в понимании, что каждый символ является байтом; таким образом, 64-разрядное число состоит из 8 байтов или двух 32-разрядных чисел.
Таким образом, одно 32-битное число может хранить 4 байта, поэтому для каждого 8-байтового блока в вашем символьном векторе вы должны сохранить пару 4-байтовых чисел в паре 32-битных чисел. Затем вы передадите эту пару в функцию xtea, что-то вроде:
uint32_t datablock[2];
datablock[0] = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | (buf[3]);
datablock[1] = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | (buf[7]);
где в этом примере buf — это тип char [8] (или, более подходяще, uint8_t [8]).
Сдвиг битов<<Оператор ‘меняет расположение места, где должны быть сохранены биты данного байта в uint32_t (таким образом, например, первый байт в приведенном выше примере хранится в первых 8 битах блока данных [0]). ‘|’ Оператор обеспечивает объединение всех битов, чтобы вы получили полное 32-битное число. Надеюсь, что это имеет смысл.
Других решений пока нет …