将一个字节数据合成多字节数据,使用场景不多,但总会遇到
方法一:位移
uint8_t a = 1;
uint8_t b = 2;
int c = (a<<8)|b;
使用指针
uint8_t a = 1;
uint8_t b = 2;
uint16_t d;
unsigned char *cptr;
cptr = (unsigned char*)(&d);
cptr[0] = a;
cptr[1] = b;
使用连接体
#include <stdio.h>
union Data {
unsigned short int16; // 16位数据
unsigned char int8[2]; // 8位数据数组
};
int main() {
union Data data;
data.int8[0] = 0x12; // 第一个8位数据
data.int8[1] = 0x34; // 第二个8位数据
printf("合成后的16位数据为: 0x%04x\n", data.int16);
return 0;
}
PS:这里我们使用小端字节序,即低位字节存储在低地址中。如果你的系统使用大端字节序,那么你可能需要交换int8[0]和int8[1]的赋值;联合体(union)是C语言中的一种特殊的数据类型,它允许在同一块内存空间中存储不同的数据类型。联合体的大小由其最大的成员决定,所有成员共享同一块内存空间。
扩展
typedef union {
unsigned int i;
unsigned char c[2];
uint8_t uchar8[4];
uint32_t uchar32;
}u_int;
uint8_t first = 1;
uint8_t second = 1;
u_int cover;
cover.c[0] = first;
cover.c[1] = second;
cover.uchar8[0] = 0;
cover.uchar8[1] = 0;
cover.uchar8[2] = 2;
cover.uchar8[3] = 2;
auto cc = cover.i; // cc=2
auto str32 = cover.uchar32; // str32=0022
即联合体(union)共享同一块内存空间