下面包含8 转 32,32转8,8转16,16转8,16转32,32转16等单片机内常用的数据类型转换,直接复制就可使用,感觉好用可以加关注,以后会经常更新一些常规好用的小代码。
1、8 转 32
/*************************
8位转32位
Len: 数据长度
*Data:数据
说明:剩余位补0;
*************************/
unsigned int Data_u32[10];
void u8tou32(unsigned char Len, unsigned char *Data)
{
unsigned char DataLen_u32, SurplusLen;//32位数据长度和8位数据剩余长度
unsigned char i,num=0;
SurplusLen = Len % 4;//知道最后空几个
if (SurplusLen != 0) Len += (4 - SurplusLen);
for (i = 0; i < Len ; i+=4)
{
//printf("%d\r\n",i);
if (i < (Len - 4))
{
Data_u32[num] |= Data[i + 0] << 24;
Data_u32[num] |= Data[i + 1] << 16;
Data_u32[num] |= Data[i + 2] << 8;
Data_u32[num] |= Data[i + 3];
}
else
{
if (SurplusLen == 3)
{
Data_u32[num] |= Data[i + 0] << 24;
Data_u32[num] |= Data[i + 1] << 16;
Data_u32[num] |= Data[i + 2] << 8;
Data_u32[num] |= 0;
}
else if (SurplusLen == 2)
{
Data_u32[num] |= Data[i + 0] << 24;
Data_u32[num] |= Data[i + 1] << 16;
Data_u32[num] |= 0;
Data_u32[num] |= 0;
}
else if (SurplusLen == 1)
{
Data_u32[num] |= Data[i + 0] << 24;
Data_u32[num] |= 0;
Data_u32[num] |= 0;
Data_u32[num] |= 0;
}
else
{
Data_u32[num] |= Data[i + 0] << 24;
Data_u32[num] |= Data[i + 1] << 16;
Data_u32[num] |= Data[i + 2] << 8;
Data_u32[num] |= Data[i + 3];
}
}
num++;
}
}
2、 32转8
/*************************
32位转8位
Len: 数据长度
*Data:数据
*************************/
unsigned char Data_u8[40];
void u32tou8(unsigned char Len, unsigned int *Data)
{
unsigned char i=0,num=0;
for (i = 0; i < Len; i++)
{
Data_u8[num + 0] = (unsigned char)((Data[i] >> 24));
Data_u8[num + 1] = (unsigned char)((Data[i] >> 16));
Data_u8[num + 2] = (unsigned char)((Data[i] >> 8));
Data_u8[num + 3] = (unsigned char)(Data[i]);
num += 4;
}
}
3、 8转16
/*************************
8位转16位
Len: 数据长度
*Data:数据
*************************/
int16_t Data_u16[20];
void u8tou16(unsigned char Len, unsigned char *Data)
{
unsigned char DataLen_u16, SurplusLen;//16位数据长度和8位数据剩余长度
unsigned char i, num = 0;
SurplusLen = Len % 2;//知道最后空几个
if (SurplusLen != 0) Len += (2 - SurplusLen);
for (i = 0; i < Len; i += 2)
{
//printf("%d\r\n", i);
if (i < (Len - 2))
{
Data_u16[num] |= Data[i + 0] << 8;
Data_u16[num] |= Data[i + 1];
}
else
{
if (SurplusLen == 1)
{
Data_u16[num] |= Data[i + 0] << 8;
Data_u16[num] |= 0;
}
else
{
Data_u16[num] |= Data[i + 0] << 8;
Data_u16[num] |= Data[i + 1];
}
}
num++;
}
}
4、 16转8
/*************************
16位转8位
Len: 数据长度
*Data:数据
*************************/
void u16tou8(unsigned char Len, int16_t *Data)
{
unsigned char i = 0, num = 0;
for (i = 0; i < Len; i++)
{
Data_u8[num + 0] = (unsigned char)((Data[i] >> 8));
Data_u8[num + 1] = (unsigned char)(Data[i]);
num += 2;
}
}
5、 16转32
/*************************
16位转32位
Len: 数据长度
*Data:数据
*************************/
void u16tou32(unsigned char Len, int16_t *Data)
{
unsigned char SurplusLen;//8位数据剩余长度
unsigned char i, num = 0;
SurplusLen = Len % 2;//知道最后空几个
if (SurplusLen != 0) Len += (2 - SurplusLen);
for (i = 0; i < Len; i += 2)
{
//printf("%d\r\n", i);
if (i < (Len - 2))
{
Data_u32[num] |= Data[i + 0] << 16;
Data_u32[num] |= Data[i + 1];
}
else
{
if (SurplusLen == 1)
{
Data_u32[num] |= Data[i + 0] << 16;
Data_u32[num] |= 0;
}
else
{
Data_u32[num] |= Data[i + 0] << 16;
Data_u32[num] |= Data[i + 1];
}
}
num++;
}
}
6、 32转16
/*************************
32位转16位
Len: 数据长度
*Data:数据
*************************/
void u32tou16(unsigned char Len, unsigned int *Data)
{
unsigned char i = 0, num = 0;
for (i = 0; i < Len; i++)
{
Data_u16[num + 0] = (int16_t)((Data[i] >> 16));
Data_u16[num + 1] = (int16_t)Data[i];
num += 2;
}
}
当然,这个函数还可以加工一下,比如反馈出生成数据的长度以及数据指针等,这些就大家自己添加吧!如果有不懂的可以在下面留言,大家相互交流。