自动根据本机字节序 将小端字节序的报文(字符数组)转为整数

1,判断本机的字节序(大端优先、小端优先)

/*
*判断当前PC为大端还是小端字节序
@ 返回值: 1:大端;0:小端。
*/
int JudgeEndianOfPC()
{
	int num = 1;
	if (*(char*)&num == 1)//小端
		return 0;

	return 1;
}

2,改变字节序(大端<--->小端互相转换)

/*
*改变字节序,变为与原来相反的字节序
*/
void EndianSwap(char *pData, int length)
{
	//printf("原本的小端序\n ");
	//for (size_t m = 0; m < length; m++)
	//{
	//	printf("0x%02x  ", pData[m]);
	//}
	//printf("\n ");
	int cnt = length / 2;
	int end = length - 1;
	char tmp;
	for (int i = 0; i < cnt; i++)
	{
		tmp = pData[i];
		pData[i] = pData[end - i];
		pData[end - i] = tmp;
	}
	//printf("大端序\n ");
	//for (size_t m = 0; m < length; m++)
	//{
	//	printf("0x%02x  ", pData[m]);
	//}
	//printf("\n ");
}

3,转换模板函数

用于将一小端优先的字节串转为实际的uint16_t/int16_t/uint32_t/int32_t

/*
*模板函数,用于将一小端优先的字节串转为实际的uint16_t/int16_t/uint32_t/int32_t
@ pData:小端字节序的字符串指针
*/
template <class T>
T LittleEndian2T(const char *pData)
{
	const int len = sizeof(T);
	T* dst = nullptr;
//采用静态变量, 避免每次都判断本地字节序,一次判断足以
	static int bigOrSmall = JudgeEndianOfPC();
	if (bigOrSmall == 0)//本机就是小端序
	{
		dst = (T*)pData;
		return *dst;
	}
	
	//下面是处理机器为大端的情况字节序
	char newChar[len] = { 0 };
	memcpy(newChar, pData, len);
	EndianSwap(newChar, len);//小端变为大端字节序
	dst = (T*)newChar;
	return *dst;
}

测试案例

int main()
{
	char s1[] = {0x44, 0x33, 0x22, 0x11};
	int32_t res = LittleEndian2T<int32_t>(s1);
	printf("Hello World! %u\n", res);
}

本人是小端电脑优先的机器,结果输出为:

Hello World! 287454020     符合预期!!

Guess you like

Origin blog.csdn.net/thequitesunshine007/article/details/119967211