Занимаюсь реализацией алгоритма ГОСТ 28147-89. Например, есть ключ 256 бит:
uint8_t key[32] = {
1, 48, 48, 22, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48,
};
Мне необходимо разбить его на блоки по 32 бита.
Есть такая функция:
void split(uint8_t *source, uint32_t *dest) {
uint8_t *p8 = source;
for (uint32_t *p32 = dest; p32 < dest + 8; ++p32) {
for (uint8_t i = 0; i < 4; ++i) {
*p32 = (*p32 << 8) | p8[i];
}
p8 += 4;
}
}
В процессе я подумал, что ее можно упразднить и просто воспользоваться union
union {
uint8_t u8Key[32];
uint32_t u32Key[8];
} UGKey;
В моей задумке я просто сходу мог бы обращаться к нужным мне парам байтов, вместо отдельного разбиения.
Но на выходе я получаю разные результаты:
for (int i = 0; i < 8; i++) {
std::cout << k32[i] << " " << k32t[i] << std::endl;
}
Левый столбец получен с помощью union
, а правый с помощью функции split
.
372256769 19935254
808464432 808464432
808464432 808464432
808464432 808464432
808464432 808464432
808464432 808464432
808464432 808464432
808464432 808464432
Возможно ли вообще через union добиться подобного результата или я пытаюсь сделать ерунду ?
Нет, если в union
сначала заполнить поле u8Key
, а затем обратится к полю u32Key
, то будет неопределенное поведение. В union
в любой момент времени может быть активно не более одного поля, и использовать его для кастования между этими полями нельзя.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть такой код, описывающий вложенные списки:
Не могу разобраться почему не считает, вроде отладчиком прошелся посмотреть чему равен lidataset
Всем добрый день! При разработке проекта на Django не удается подключить стили CSSСоздана директория static, где лежат как стили, так и картинки
Как сделать чтобы функция выполнялась только тогда, когда выполнились оба условия? Необходимо, чтобы блок становился серым только при условии,...