Разбиение на блоки по битам

268
07 июня 2021, 18:40

Занимаюсь реализацией алгоритма ГОСТ 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 добиться подобного результата или я пытаюсь сделать ерунду ?

Answer 1

Нет, если в union сначала заполнить поле u8Key, а затем обратится к полю u32Key, то будет неопределенное поведение. В union в любой момент времени может быть активно не более одного поля, и использовать его для кастования между этими полями нельзя.

READ ALSO
Доступ к вложенным элементам из управляющего класса

Доступ к вложенным элементам из управляющего класса

Есть такой код, описывающий вложенные списки:

104
Подсчет вложенных тегов

Подсчет вложенных тегов

Не могу разобраться почему не считает, вроде отладчиком прошелся посмотреть чему равен lidataset

242
Не подключаются стили CSS в проекте на Django

Не подключаются стили CSS в проекте на Django

Всем добрый день! При разработке проекта на Django не удается подключить стили CSSСоздана директория static, где лежат как стили, так и картинки

187
Как сделать чтобы функция выполнялась только тогда, когда выполнились оба условия?

Как сделать чтобы функция выполнялась только тогда, когда выполнились оба условия?

Как сделать чтобы функция выполнялась только тогда, когда выполнились оба условия? Необходимо, чтобы блок становился серым только при условии,...

109