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

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     符合预期!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thequitesunshine007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值