如何判斷設(shè)備的字節(jié)序,提供 4 種方法給大家參考。
首先就是從概念入手。
所謂小端字節(jié)序,高字節(jié)存放在高地址,低字節(jié)存放在低地址;大端字節(jié)序反過來。
定義一個無符號 short 類型,初始化成 0x0102,定義一個 char 類型指針,保存 num 的地址。
int main() { unsigned short num = 0x0102; unsigned char *p = (unsigned char *)# if (p[0] == 0x02) printf("小端字節(jié)序 "); else if (p[0] == 0x01) printf("大端字節(jié)序 "); return 0; }
如果 p[0] 是 0x02,說明低地址保存了低字節(jié),設(shè)備就是小端。
如果 p[0] 是 0x01,說明低地址保存了高字節(jié),設(shè)備就是大端。
第二個,使用聯(lián)合體。
聯(lián)合體的特點是所有成員共享同一塊內(nèi)存。
union Test { char p[2]; short val; };
在這個聯(lián)合體中,char 類型的數(shù)組和 short 類型變量占用了同一塊內(nèi)存,數(shù)組的第 0 個元素一定存放在低地址。
如果 p[0] 保存的是 0x02,說明低地址保存了低字節(jié),設(shè)備是小端。反之,是大端。
int main() { union Test t; t.val = 0x0102; if (t.p[0] == 0x02) printf("小端字節(jié)序 "); else if (t.p[0] == 0x01) printf("大端字節(jié)序 "); return 0; }
這種方法跟第一種差不多。
第三個,通過宏來判斷。
比如在 Linux 系統(tǒng)中,包含頭文件,使用 BYTE_ORDER 就能直觀的看出字節(jié)序。
#includeint main() { if (__BYTE_ORDER == __LITTLE_ENDIAN) printf("小端字節(jié)序 "); else if (__BYTE_ORDER == __BIG_ENDIAN) printf("大端字節(jié)序 "); return 0; }
第四個,使用結(jié)構(gòu)體位域。
這個方法同樣是從概念入手,判斷 p[0] 這個低地址保存的是低字節(jié)還是高字節(jié)。
#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("小端字節(jié)序 "); else if (p[0] == 0x04) printf("大端字節(jié)序 "); return 0; }
不過這個方法不太推薦,位域的具體布局取決于編譯器,跟環(huán)境有關(guān),所以這種方法,參考下就行。
-
設(shè)備
+關(guān)注
關(guān)注
2文章
4530瀏覽量
70759 -
字節(jié)
+關(guān)注
關(guān)注
0文章
40瀏覽量
13775
原文標題:四種方法判斷設(shè)備的字節(jié)序
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論