大端與小端

2021-07-10 08:21:49 字數 2623 閱讀 9083

用例:

#include 

bool isbigend()

bool isbigending()

obj;

obj.a = 0x1234;

if (obj.b == 0x12)

return

true;

else

return

false;

}int main()

分析:

union 是利用了它的性質:

所有成員從低位址開始存放

小端:0x0000 01

0x0001 00

0x0002 00

0x0003 00

大端:0x0000 00

0x0001 00

0x0002 00

0x0003 01

大端與小端沒有優劣之分,表示不同而已

小端在計算機內進行數值轉換時候不需要移位。

而大端的符號位判定總是訪問第乙個位元組就可以了。

unsigned

int value = 0x12345678;

unsigned

char buf[4];

小端:buf[0] = 0x78 低位

buf[1] = 0x56

buf[2] = 0x34

buf[3] = 0x12 高位

大端:buf[0] = 0x12 高位

buf[1] = 0x34

buf[2] = 0x56

buf[3] = 0x78 低位

一般的作業系統為小端, 而通訊協議通常為大端。

常見cpu的位元組序

big endian : powerpc、ibm、sun

little endian : x86、dec

arm既可以工作在大端模式,也可以工作在小端模式。

常見檔案的位元組序

adobe ps – big endian

bmp – little endian

dxf(autocad) – variable

gif – little endian

jpeg – big endian

macpaint – big endian

rtf – little endian

16位字資料

#define bigtolittle16(a)   

(( ((uint16)(a) & 0xff00) >> 8) | \

(( (uint16)(a) & 0x00ff) << 8))

32位雙字資料

#define bigtolittle32(a)  

((( (uint32)(a) & 0xff000000) >> 24) | \

(( (uint32)(a) & 0x00ff0000) >> 8) | \

(( (uint32)(a) & 0x0000ff00) << 8) | \

(( (uint32)(a) & 0x000000ff) << 24) )

從軟體的角度上,不同端模式的處理器進行資料傳遞時必須要考慮端模式的不同。如進行網路資料傳遞時,必須要考慮端模式的轉換。在socket介面程式設計中,以下幾個函式用於大小端位元組序的轉換。

#include 

#define ntohs(n)

//16位資料型別網路位元組順序到主機位元組順序的轉換

#define htons(n)

//16位資料型別主機位元組順序到網路位元組順序的轉換

#define ntohl(n)

//32位資料型別網路位元組順序到主機位元組順序的轉換

#define htonl(n)

//32位資料型別主機位元組順序到網路位元組順序的轉換

其中網際網路使用的網路位元組順序採用大端模式進行編址,而主機位元組順序根據處理器的不同而不同,如powerpc處理器使用大端模式,而pentuim處理器使用小端模式。

大端模式處理器的位元組序到網路位元組序不需要轉換,此時ntohs(n)=n,ntohl = n;而小端模式處理器的位元組序到網路位元組必須要進行轉換,此時ntohs(n) = __swab16(n),ntohl = __swab32(n)。__swab16與__swab32函式定義如下所示。

#define ___swab16(x)  

#define ___swab32(x)

powerpc處理器提供了lwbrx,lhbrx,stwbrx,sthbrx四條指令用於處理位元組序的轉換以優化__swab16和__swap32這類函式。此外powerpc處理器中的rlwimi指令也可以用來實現__swab16和__swap32這類函式。

在對普通檔案進行處理也需要考慮端模式問題。在大端模式的處理器下對檔案的32,16位讀寫操作所得到的結果與小端模式的處理器不同。單純從軟體的角度理解上遠遠不能真正理解大小端模式的區別。事實上,真正的理解大小端模式的區別,必須要從系統的角度,從指令集,暫存器和資料匯流排上深入理解,大小端模式的區別。

大端與小端

網際網路使用網路位元組順序採用大端模式進行編址,大端儲存也稱為網路位元組序,因為tcp ip包在網路中傳輸時都要求以這種次序,以其他形式儲存資料的機器 主機位元組順序根據處理器的不同而不同,如powerpc處理器,使用大端模式,而pentuim處理器使用小端模式 則必須在傳送資料之前把首部轉換成網路...

大端與小端

端模式 endian 的這個詞出自 jonathan swift 書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為 big endian 從尖頭開始將雞蛋敲開的人被歸為 littile endian 小人國的內戰就源於吃雞蛋時是究竟從大頭 big ...

大端與小端

大端表示跟小端表示這兩者的具體意義我老是記不住,當然不是說它的意思不懂,而只是容易搞混。現在記一下,以後就比較有印象了。在c 中,定義乙個int值的時候,它所占用的記憶體是4個位元組,然而這4個位元組裡面,我們如果得到這個int值的記憶體位址,其實就是它的最低位置的位址,如 int a 假設 a的記...