常用數據轉換,8位轉16位/32位函數,複製就能用

        下面包含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;
	}
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章