将 n 字节整数拆分为单个字节的便携式方法

Portable way of splitting n-byte integer into single bytes

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

为此,我可以轻松地使用位掩码和移位来获得我想要的内容。但是,我希望它是可移植的,既可以在大端和小端上运行,又可以在不丢弃位但 rotate through carry(掩码可以消除多余位,对吗?)的平台上运行。

示例代码:

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;

我想保证这适用于任何支持 32 位或更多整数的平台。不知道对不对

您提供的代码是最便携的实现方式。您将一个 32 位宽的无符号整数值转换为正好 8 位宽的无符号整数值数组。 buffer 数组中的结果字节采用大端顺序。

不需要屏蔽。来自 C11 6.5.7p5:

The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has
a signed type and a nonnegative value, the value of the result is the integral part of the quotient of
E1 / 2^E2.

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

我可以推荐看一下我记得的一个实现,我想它已经以一种非常安全的方式实现了所有可能的拆分和组合固定宽度整数的变体,最多 64 位,从字节来回,那是在 gpsd bits.h.