将uint8_t数组转换为uint16_t

时间:2018-09-05 10:43:24

标签: c

我有一个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;

我使用错误的方法来获取我需要的东西吗?还是缺少什​​么?

3 个答案:

答案 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。