我有一个uint8_t数组,其中包含两个元素:
uint8_t ui8[2]; // uint8_t array
ui8[0] = 70; // LSB
ui1[1] = 60; // MSB
我想从这两个uin8_t值中获得一个uint16_t数字(而不是数组)。我使用这种方法来获得以下结果:uint16_t ui16 = 6070
uint16_t ui16 = ui8[1] | (ui8[0] << 8);
但是我得到了uint16_t ui16 = 15430;
我使用错误的方法来获取我需要的东西吗?还是缺少什么?
答案 0 :(得分:4)
也许您打算使用十六进制数字:
uint8_t ui8[2]; // uint8_t array
ui8[0] = 0x70; // LSB
ui1[1] = 0x60; // MSB
uint16_t ui16 = ui8[1] | (ui8[0] << 8);
printf("%x\n", ui16); // 7060
如果要使用十进制数,则需要将“ MSB”乘以100并将其相加。对此使用十进制数更为罕见。
uint8_t ui8[2]; // uint8_t array
ui8[0] = 70; // LSB
ui1[1] = 60; // MSB
uint16_t ui16 = ui8[1] + (ui8[0] * 100);
printf("%d\n", ui16); // 7060
请不要在两种情况下都将“ 70”放在“ 60”之前,因为您要移动数组的第一个元素(70)。 70将成为MSB。
答案 1 :(得分:2)
您还可以对其使用联合修剪:
#include <stdio.h>
#include <stdint.h>
typedef union {
uint8_t u8[2];
uint16_t u16;
}data16;
int main() {
data16 d16;
d16.u8[0] = 0x60;
d16.u8[1] = 0x70;
printf("%hx\n", d16.u16);
// it works in the opposite direction as well
// lets try to store 7060 decimal in two bytes
d16.u16 = 7060u;
printf("storing %hu decimal in two bytes: LSB:0x%0hhx (%hhu decimal), MSB:0x%0hhx (%hhu decimal)\n", d16.u16, d16.u8[0], d16.u8[0], d16.u8[1], d16.u8[1]);
return 0; }
答案 2 :(得分:0)
uint8_t ui8[2]; // uint8_t array
ui8[0] = 70; // LSB
ui1[1] = 60; // MSB
要将两个值都复制到uint16中,可以执行以下操作:
uint16_t output = 0;
output |= (uint16_t)ui8[0] << 8;
output |= (uint16_t)ui8[1] << 0;
您可以使用类似的逻辑从uint8_t数组中写入uint32_t / uint64_t。