常用数据转换,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;
	}
}

       当然,这个函数还可以加工一下,比如反馈出生成数据的长度以及数据指针等,这些就大家自己添加吧!如果有不懂的可以在下面留言,大家相互交流。

猜你喜欢

转载自blog.csdn.net/qq_35671135/article/details/85721234