将n字节整数分成单个字节的便携方式

Try*_*hon 4 c portability bit-manipulation

问题很简单:取一个32位或64位整数并将其拆分为通过(通常)1字节接口发送,如uart,spi或i2c.

要做到这一点,我可以轻松地使用位掩码和移位来获得我想要的东西.但是,我希望它是可移植的,可以在大端和小端上工作,但也可以使它适用于不丢弃位但是通过进旋转的平台(屏蔽可以摆脱多余的位?).

示例代码:

uint32_t value;
uint8_t buffer[4];
buffer[0] = (value >> 24) & 0xFF;
buffer[1] = (value >> 16) & 0xFF;
buffer[2] = (value >> 8) & 0xFF;
buffer[3] = value & 0xFF;
Run Code Online (Sandbox Code Playgroud)

我想保证这适用于任何支持32位或更多整数的平台.我不知道这是否正确.

Kam*_*Cuk 7

您提供的代码是最便携的方式.将具有32位宽度的单个无符号整数值转换为正好为8位宽度的无符号整数值数组.buffer数组中生成的字节采用大端顺序.

不需要掩蔽.从C11 6.5.7p5:

E1 >> E2的结果是E1右移E2位位置.如果E1具有无符号类型或者E1具有
有符号类型和非负值,则结果的值是
E1/2 ^ E2 的商的整数部分.

并且转换为具有8位宽度的整数(到该值)等于屏蔽8位.所以(result >> 24) & 0xff等于(uint8_t)(result >> 24)(到值).在分配给uint8_t变量时,不需要屏蔽.无论如何,我会安全地假设它将由一个理智的编译器优化.

我可以建议看一下我记得的一个实现,我猜我已经以一种非常安全的方式实现了所有可能的分裂和组合固定宽度整数的变体,从字节到后面的64位,即gpsd位.h.