如何判斷設備的字節序,提供 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文章
4477瀏覽量
70544 -
字節
+關注
關注
0文章
40瀏覽量
13718
原文標題:四種方法判斷設備的字節序
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論