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 符合预期!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)