将 uint8_t 数组转换为 uint16_t

ahm*_*dkh 3 c

我有一个包含两个元素的 uint8_t 数组:

uint8_t ui8[2]; // uint8_t array
ui8[0] = 70; // LSB
ui1[1] = 60; // MSB
Run Code Online (Sandbox Code Playgroud)

我想从这两个 uin8_t 值中获取一个 uint16_t 数字(不是数组)。我使用这种方法来得到这个结果:uint16_t ui16 = 6070

uint16_t ui16 = ui8[1] | (ui8[0] << 8);
Run Code Online (Sandbox Code Playgroud)

但我得到了 uint16_t ui16 = 15430;

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

blu*_*112 7

也许您打算使用十六进制数字:

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
Run Code Online (Sandbox Code Playgroud)

如果要使用十进制数,则需要将“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
Run Code Online (Sandbox Code Playgroud)

请不要在这两种情况下,“70”将在“60”之前,因为您正在移动数组的第一个元素(70)。70 将是 MSB。

  • 另请注意,代码应在移动之前将 `uint8_t` 值转换为 `uint16_t`。否则,`uint8_t` 将被提升为 `int`,它可能是 16 位,在这种情况下,移位可能会溢出,具有未定义的行为。 (3认同)

P__*_*J__ 5

你也可以使用联合双关语:

#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; }
Run Code Online (Sandbox Code Playgroud)