一、不同的操作系统字节序是不一样的。
我们可以写一个函数,执行一下,借助联合体判断自己当前使用的系统是大端还是小端。
void test()
{
union
{
short i;
char a[2];
}u;
u.a[0] = 0x11;
u.a[1] = 0x22;
qDebug()<<QString("0x2211 为小端,0x1122 为大端 oupt:0x%1").arg(QString::number(u.i, 16));
}
执行上述这段代码的结果是:
"0x2211 为小端,0x1122 为大端 oupt:0x2211"
二、float型数据大小端转换
然后,定义一个联合体:(在我使用的Linux系统下,我测试的float型数据大小占4个字节)
union UnionIntFloat
{
int m_i32;
float m_f32;
};
最后,使用函数进行转换:
int swapInt32(int value)
{
return ((value & 0x000000FF) << 24) |
((value & 0x0000FF00) << 8) |
((value & 0x00FF0000) >> 8) |
((value & 0xFF000000) >> 24);
}
float float32BigEndian(float value)
{
union UnionIntFloat un_i2f;
un_i2f.m_f32 = value;//因为输入的是float类型,用float接受不会改变数值
float *pf = NULL;
int *pi = NULL;
pf = &un_i2f.m_f32;
pi = &un_i2f.m_i32;
un_i2f.m_i32 = swapInt32(un_i2f.m_i32);//用int型接受不会改变数值
return un_i2f.m_f32;
}
本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载。