合并 uint8_t、uint16_t 和 uint8_t
Combining uint8_t, uint16_t and uint8_t
我有三个值,依次为 uint8_t
、uint16_t
和 uint8_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 是为了不丢失任何信息。
我有三个值,依次为 uint8_t
、uint16_t
和 uint8_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 是为了不丢失任何信息。