将uint16_t转换为字节,反之亦然-与系统字节顺序无关

时间:2019-04-20 22:23:54

标签: c bitwise-operators endianness

通过搜索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 个答案:

答案 0 :(得分:1)

您的代码不依赖于字节序。使用掩码查看变量的位时,它们始终看起来像是大端的。高位字节将显示在低位字节的左侧。即使在小字节序的计算机上交换它们,我们也不是明智的。

但是,话虽如此,您可以只复制字节而无需实际查看它们。没有遮罩,没有移位,只需复制字节即可:

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

// reassemble
uint16_t y;
memcpy(&y, bytes, sizeof(y));

答案 1 :(得分:0)

字节序指示在内存中存储数字的方式。 但是,当数字从内存加载到寄存器时,它与字节序无关。输入号码上的所有操作都通过寄存器进行,结果根据字节顺序存储回内存中。

Eg. 
Number = 0xAABB

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

Big Endian       0x3000                0xAA
                 0x3001                0xBB

但是,当加载到32位寄存器中时,该数字仍将为0xAABB,因此无论字节序如何,uint8_t字节1和uint8_t字节2都将具有相同的值。