如何判断设备的字节序,提供 4 种方法给大家参考。
首先就是从概念入手。
所谓小端字节序,高字节存放在高地址,低字节存放在低地址;大端字节序反过来。
定义一个无符号 short 类型,初始化成 0x0102,定义一个 char 类型指针,保存 num 的地址。
int main()
{
unsigned short num = 0x0102;
unsigned char *p = (unsigned char *)#
if (p[0] == 0x02)
printf("小端字节序
");
else if (p[0] == 0x01)
printf("大端字节序
");
return 0;
}
如果 p[0] 是 0x02,说明低地址保存了低字节,设备就是小端。
如果 p[0] 是 0x01,说明低地址保存了高字节,设备就是大端。
第二个,使用联合体。
联合体的特点是所有成员共享同一块内存。
union Test
{
char p[2];
short val;
};
在这个联合体中,char 类型的数组和 short 类型变量占用了同一块内存,数组的第 0 个元素一定存放在低地址。
如果 p[0] 保存的是 0x02,说明低地址保存了低字节,设备是小端。反之,是大端。
int main()
{
union Test t;
t.val = 0x0102;
if (t.p[0] == 0x02)
printf("小端字节序
");
else if (t.p[0] == 0x01)
printf("大端字节序
");
return 0;
}
这种方法跟第一种差不多。
第三个,通过宏来判断。
比如在 Linux 系统中,包含头文件,使用 BYTE_ORDER 就能直观的看出字节序。
#includeint main() { if (__BYTE_ORDER == __LITTLE_ENDIAN) printf("小端字节序 "); else if (__BYTE_ORDER == __BIG_ENDIAN) printf("大端字节序 "); return 0; }
第四个,使用结构体位域。
这个方法同样是从概念入手,判断 p[0] 这个低地址保存的是低字节还是高字节。
#includestruct Test { unsigned int a : 8; unsigned int b : 8; unsigned int c : 16; }; int main() { struct Test t = {0x01, 0x02, 0x0304}; unsigned char *p = (unsigned char *)&t; if (p[0] == 0x01) printf("小端字节序 "); else if (p[0] == 0x04) printf("大端字节序 "); return 0; }
不过这个方法不太推荐,位域的具体布局取决于编译器,跟环境有关,所以这种方法,参考下就行。
全部0条评论
快来发表一下你的评论吧 !