Как преобразовать беззнаковое целое в два беззнаковых шорта в C ++? - PullRequest
1 голос
/ 24 февраля 2020

У меня изначально было 2 WORD (это 4 байта). Я сохранил их в unsigned int. Как я могу разделить это так, чтобы у меня было 2 (крайних левых) байта в одной переменной unsigned short, а другие 2 байта в другой переменной unsigned short?

Надеюсь, мой вопрос ясен, в противном случае, пожалуйста, скажите я и я добавлю больше деталей! :)

Пример: этот шестнадцатеричный код хранится в unsigned int: 4f07aabb

Как я могу превратить это в два шорта без знака, чтобы один из них содержал 4f07, а другой - aabb * * 1014

1 Ответ

5 голосов
/ 24 февраля 2020

Если вы уверены, что unsigned int имеет как минимум 4 байта в вашей целевой системе (это не гарантировано!), Вы можете сделать:

unsigned short one = static_cast<unsigned short>(original >> (2 * 8));
unsigned short two = static_cast<unsigned short>(original % (1 << (2 * 8)));

Это только гарантированно сработает, если исходное значение действительно содержит только 4-байтовое значение (возможно, с дополнением нулями впереди). Если вы не любите битшифтинг, вы также можете сделать

uint32_t original = 0x4f07aabb; // guarantee 32 bits
uint16_t parts[2];
std::memcpy(&parts[0], &original, sizeof(uint32_t));
unsigned short one = static_cast<unsigned short>(parts[0]);
unsigned short two = static_cast<unsigned short>(parts[1]);

. Это даст два значения в зависимости от порядка байтов целевой системы; на архитектуре с прямым порядком байтов результаты обратные. Вы можете проверить порядок байтов в следующих C ++ 20-х std::endian::native.

...