将 uint16_t 转换为字节,反之亦然 - 与系统字节序无关
Convert a uint16_t to bytes and vice versa - independent of system 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;
但据我所知 - 这只适用于小端系统,不适用于大端系统。
有没有办法独立于系统的字节序来实现相同的事情?
您的代码不依赖字节序。当使用掩码查看变量位时,它们总是表现为大端。高位字节将出现在低位字节的左侧。即使在小端机器上它们被交换,我们 none 更聪明。
但是,话虽如此,您也可以只复制字节而不实际查看它们。没有掩码,没有移位,只是复制字节:
// extract the bytes
uint8_t bytes[sizeof(x)];
memcpy(bytes, &x, sizeof(x));
// reassemble
uint16_t y;
memcpy(&y, bytes, sizeof(y));
字节序决定了数字在内存中的存储方式。
但是,当数字从内存加载到寄存器时,它与字节顺序无关。对输入数字的所有操作都通过寄存器进行,结果根据字节序存储回内存。
Eg.
Number = 0xAABB
Memory Address Value
Little Endian 0x3000 0xBB
0x3001 0xAA
Big Endian 0x3000 0xAA
0x3001 0xBB
但是当加载到 32 位寄存器中时,数字仍然是 0xAABB,因此 uint8_tbyte1 和 uint8_tbyte2 将具有相同的值,而不管字节序如何。
通过 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;
但据我所知 - 这只适用于小端系统,不适用于大端系统。
有没有办法独立于系统的字节序来实现相同的事情?
您的代码不依赖字节序。当使用掩码查看变量位时,它们总是表现为大端。高位字节将出现在低位字节的左侧。即使在小端机器上它们被交换,我们 none 更聪明。
但是,话虽如此,您也可以只复制字节而不实际查看它们。没有掩码,没有移位,只是复制字节:
// extract the bytes
uint8_t bytes[sizeof(x)];
memcpy(bytes, &x, sizeof(x));
// reassemble
uint16_t y;
memcpy(&y, bytes, sizeof(y));
字节序决定了数字在内存中的存储方式。 但是,当数字从内存加载到寄存器时,它与字节顺序无关。对输入数字的所有操作都通过寄存器进行,结果根据字节序存储回内存。
Eg.
Number = 0xAABB
Memory Address Value
Little Endian 0x3000 0xBB
0x3001 0xAA
Big Endian 0x3000 0xAA
0x3001 0xBB
但是当加载到 32 位寄存器中时,数字仍然是 0xAABB,因此 uint8_tbyte1 和 uint8_tbyte2 将具有相同的值,而不管字节序如何。