下面包含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;
}
}
當然,這個函數還可以加工一下,比如反饋出生成數據的長度以及數據指針等,這些就大家自己添加吧!如果有不懂的可以在下面留言,大家相互交流。