如何判断设备的字节序,提供 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; }
不过这个方法不太推荐,位域的具体布局取决于编译器,跟环境有关,所以这种方法,参考下就行。
-
设备
+关注
关注
2文章
4482浏览量
70552 -
字节
+关注
关注
0文章
40浏览量
13718
原文标题:四种方法判断设备的字节序
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论