Конвертировать uint16_t в байты и наоборот - независимо от системного порядка байтов - PullRequest
2 голосов
/ 21 апреля 2019

Просматривая через SO, я обнаружил, что могу сделать следующее, чтобы извлечь байты из uint16_t, а затем собрать их в исходное число:

uint16_t x = 700;

// extract the bytes
uint8_t byte1 = (x >> 8) & 0xFF;
uint8_t byte2 = x & 0xFF;

// reassemble
uint16_t y = (byte1 << 8) + byte2;

Но, насколько я понимаю- это будет работать только в системах с прямым порядком байтов, а не в системах с прямым порядком байтов.

Есть ли способ достичь того же самого, независимо от порядка в системе?

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Ваш код не зависит от порядкового номера. При взгляде на биты переменных с использованием масок они всегда будут выглядеть как big-endian. Байты старшего разряда будут находиться слева от байтов младшего разряда. Хотя на машинах с прямым порядком байтов они меняются местами, мы не мудрее.

Однако, с учетом сказанного, вы можете вместо этого просто скопировать байты, фактически не глядя на них. Без масок, без смен, просто скопируйте байты:

// extract the bytes
uint8_t bytes[sizeof(x)];
memcpy(bytes, &x, sizeof(x));

// reassemble
uint16_t y;
memcpy(&y, bytes, sizeof(y));
0 голосов
/ 21 апреля 2019

Endianness диктует способ, которым число сохраняется в памяти. Однако, когда число загружается из памяти для регистрации, оно не зависит от порядка байтов. Все операции с входным номером выполняются через регистры, и результат сохраняется в памяти в соответствии с порядком байтов.

Eg. 
Number = 0xAABB

                 Memory Address        Value
Little Endian    0x3000                0xBB
                 0x3001                0xAA

Big Endian       0x3000                0xAA
                 0x3001                0xBB

Но при загрузке в 32-битный регистр число все равно будет 0xAABB, в результате чего uint8_t byte1 и uint8_t byte2 будут иметь одинаковые значения независимо от порядка байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...