C 将uint8\u t数组转换为uint16\u t

C 将uint8\u t数组转换为uint16\u t,c,C,我有一个uint8_t数组,它包含两个元素: uint8_t ui8[2]; // uint8_t array ui8[0] = 70; // LSB ui1[1] = 60; // MSB 我想从这两个uin8_t值中获取uint16_t编号(而不是数组)。为了得到这个结果,我使用了这种方法:uit16\u t ui16=6070 uint16_t ui16 = ui8[1] | (ui8[0] << 8); uint16\u t ui16=ui8[1]|(ui8[0]也许您想

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

uint8_t ui8[2]; // uint8_t array
ui8[0] = 70; // LSB
ui1[1] = 60; // MSB
我想从这两个uin8_t值中获取uint16_t编号(而不是数组)。为了得到这个结果,我使用了这种方法:
uit16\u t ui16=6070

uint16_t ui16 = ui8[1] | (ui8[0] << 8);

uint16\u t ui16=ui8[1]|(ui8[0]也许您想使用十六进制数字:

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

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

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;
uint16\u t输出=0;

输出|=(uint16_t)ui8[0]您也可以对其使用联合双关:

#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; }
#包括
#包括
typedef联合{
uint8_t u8[2];
uint16_t u16;
}数据16;
int main(){
数据16 d16;
d16.u8[0]=0x60;
d16.u8[1]=0x70;
printf(“%hx\n”,d16.u16);
//它的工作方向也是相反的
//让我们尝试将7060十进制存储在两个字节中
d16.u16=7060u;
printf(“将%hu十进制存储在两个字节中:LSB:0x%0hhx(%hhu十进制),MSB:0x%0hhx(%hhu十进制)\n”,d16.u16,d16.u8[0],d16.u8[0],d16.u8[1],d16.u8[1]);
返回0;}

为什么您会得到6070(或者应该是7060?)?100是从哪里来的?@Biffen我不明白为什么它应该是7060?假设我有一个这个数字6070,它是一个uint16_t,我需要将它复制到另一个变量,但我有一个只接受uint8_t类型的函数。在这种情况下,我应该怎么做?我的想法是制作一个包含两个元素的数组:70和60,然后将它们附加到获取uint16_t值。60*256+70=15430@zerocoldTUN我想是7060,因为在
ui8[0]
中有70个,在
ui8[1]中有60个
,但无需担心,您似乎想使用小尾端。但仍不清楚的是为什么要进行十进制运算。如果您将8位值视为16位值的二进制“一半”,则60和70“串联”为15430。另外请注意,代码应将
uint8\u t
值转换为
uint16\u t
b否则,
uint8\u t
将升级为
int
,可能为16位,在这种情况下,移位可能溢出,其行为未定义。
#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; }