合并 uint8_t、uint16_t 和 uint8_t

Combining uint8_t, uint16_t and uint8_t

我有三个值,依次为 uint8_tuint16_tuint8_t。我正在尝试将它们合并为一个 uint_32 而不会丢失订单。我从这里找到 this 问题,但我被中间的 uint_16 值卡住了。

例如:

uint8_t v1=0x01;  
uint16_t v2=0x1001;
uint8_t v3=0x11; 

uint32_t comb = 0x01100111;

我正在考虑将 v2 分成两个单独的 uint8_t:s 但意识到可能有一些更简单的方法来解决它。

我的尝试:

v2 = 0x1001;
a = v2 & 0xFF;
b = v1 >> 8;
first = ((uint16_t)v1 << 8) | a;
end = ((uint16_t)b << 8) | v3;

comb = ((uint32_t)first << 16) | end; 

这应该是您的 嵌套 隐含和 one-liner 书面转换:

uint32_t comb = ((uint32_t)v1 << 24) | (((uint32_t)v2 << 8) | v3);

基本上,你有 8 | 16 | 8 构建 32 位大小的类型。要移动第一个并放在头部,您需要转换为 32 位并使用 24 (32-8)。然后在移动时或下一个,即放置在正确的偏移处,其余分别填充零和铸造。

您使用 OR 是为了不丢失任何信息。