用例:
分析:#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位字資料
32位雙字資料#define bigtolittle16(a)
(( ((uint16)(a) & 0xff00) >> 8) | \
(( (uint16)(a) & 0x00ff) << 8))
從軟體的角度上,不同端模式的處理器進行資料傳遞時必須要考慮端模式的不同。如進行網路資料傳遞時,必須要考慮端模式的轉換。在socket介面程式設計中,以下幾個函式用於大小端位元組序的轉換。#define bigtolittle32(a)
((( (uint32)(a) & 0xff000000) >> 24) | \
(( (uint32)(a) & 0x00ff0000) >> 8) | \
(( (uint32)(a) & 0x0000ff00) << 8) | \
(( (uint32)(a) & 0x000000ff) << 24) )
其中網際網路使用的網路位元組順序採用大端模式進行編址,而主機位元組順序根據處理器的不同而不同,如powerpc處理器使用大端模式,而pentuim處理器使用小端模式。#include
#define ntohs(n)
//16位資料型別網路位元組順序到主機位元組順序的轉換
#define htons(n)
//16位資料型別主機位元組順序到網路位元組順序的轉換
#define ntohl(n)
//32位資料型別網路位元組順序到主機位元組順序的轉換
#define htonl(n)
//32位資料型別主機位元組順序到網路位元組順序的轉換
大端模式處理器的位元組序到網路位元組序不需要轉換,此時ntohs(n)=n,ntohl = n;而小端模式處理器的位元組序到網路位元組必須要進行轉換,此時ntohs(n) = __swab16(n),ntohl = __swab32(n)。__swab16與__swab32函式定義如下所示。
powerpc處理器提供了lwbrx,lhbrx,stwbrx,sthbrx四條指令用於處理位元組序的轉換以優化__swab16和__swap32這類函式。此外powerpc處理器中的rlwimi指令也可以用來實現__swab16和__swap32這類函式。#define ___swab16(x)
#define ___swab32(x)
在對普通檔案進行處理也需要考慮端模式問題。在大端模式的處理器下對檔案的32,16位讀寫操作所得到的結果與小端模式的處理器不同。單純從軟體的角度理解上遠遠不能真正理解大小端模式的區別。事實上,真正的理解大小端模式的區別,必須要從系統的角度,從指令集,暫存器和資料匯流排上深入理解,大小端模式的區別。
大端與小端
網際網路使用網路位元組順序採用大端模式進行編址,大端儲存也稱為網路位元組序,因為tcp ip包在網路中傳輸時都要求以這種次序,以其他形式儲存資料的機器 主機位元組順序根據處理器的不同而不同,如powerpc處理器,使用大端模式,而pentuim處理器使用小端模式 則必須在傳送資料之前把首部轉換成網路...
大端與小端
端模式 endian 的這個詞出自 jonathan swift 書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為 big endian 從尖頭開始將雞蛋敲開的人被歸為 littile endian 小人國的內戰就源於吃雞蛋時是究竟從大頭 big ...
大端與小端
大端表示跟小端表示這兩者的具體意義我老是記不住,當然不是說它的意思不懂,而只是容易搞混。現在記一下,以後就比較有印象了。在c 中,定義乙個int值的時候,它所占用的記憶體是4個位元組,然而這4個位元組裡面,我們如果得到這個int值的記憶體位址,其實就是它的最低位置的位址,如 int a 假設 a的記...