C 判斷主機位元組序(大端BE小端LE)

2021-08-18 10:03:56 字數 1549 閱讀 5215

通過簡單的c程式可以判斷當前主機位元組序是大端(big-endian:be)或小端(little endian:le)。

code:

#include 

#include

int main()

un;un.s = 0x0102;

if ( sizeof(short) == 2 )

else

printf("sizeof(short) = %d\n", sizeof(short));

exit(0);

}

編譯 && 執行:

linux(le):

$ uname -a

linux localhost.localdomain 2.6

.32-642.el6.x86_64 #1 smp tue may 10 17:27:01 utc 2016 x86_64 x86_64 x86_64 gnu/linux

$ gcc -o byte-order

byte-order.c

$ ./byte-order

little-endian

hpux(be):

$ uname -a

hp-ux opel b.11

.31 u ia64 2596713519 unlimited-user license

$ acc -o byte-order byte-order

.c$ ./byte-order

big-endian

aix(be):

$ uname -a

aix aix68113 1

600f7caa94c00

$ xlc -o byte-order

byte-order.c

$ ./byte-order

big-endian

2018.04.15更新

在看到htons等函式時,忽然想到還有個辦法判斷主機位元組序。

#include 

#include

#include

#include

int main()

linux:

$ gcc -o main main.c

$ ./main

little

endian

原理是:

我雖然不知道主機位元組序是啥,但是我可以通過htons這樣的函式,將其統一轉換為網路位元組序。

網路位元組序是大端(be)。

我拿轉換前的數值和轉換後的大端數值進行比較:

如果相等,說明當前主機位元組序等價於網路位元組序,be;否則,當前主機位元組序為le。

需要注意:

構建主機位元組序的數值時,不要使在le和be下都一樣的數值,例如:

(16bit):

0xffffffff

0xaabbbbaa

這樣的數值,在le和be下數值都是相等的,=.=!!!

主機位元組序 大端小端

開發中總是遇到大端和小端位元組序問題,這都是由cpu引入的.對於x86體系cpu,採用的小端位元組序 對於ppc體系cpu,採用的大端位元組序 什麼叫小端,什麼叫大端呢?舉個簡單例子 小端 int i 0x12345678 在記憶體裡存的是 78 56 34 12 大端 int i 0x123456...

大端位元組序 小端位元組序(網路位元組序 主機位元組序)

大端位元組序 整數的高位位元組儲存在記憶體的低位址處,低位元組儲存在記憶體的高位址處。一般pc大多採用小端位元組序,也稱為主機位元組序。網路上傳輸採用大端位元組序,也稱為網路位元組序。linux中常用轉換函式如下 include uint32 t htonl uint32 t hostlong 無符...

c 位元組序判斷(大端和小端)

little endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端 big endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端 如 16bit寬的數0x1234在little endian模式 以及big endian模式 cpu記憶體中...