1.簡介
記憶體中儲存資料有兩種方法:小端模式和大端模式。這取決於CPU,x86的CPU一般為小端模式。
little-endian:將低序位元組儲存在起始地址;(只需記住小端,就可推出大端。兩個都記反而容易混淆)
big-edian:將高序位元組儲存在起始地址;
術語“大端”和“小端”表示將多位元組值的哪一端儲存在起始地址。
比如要儲存一個兩位元組的短整數。
short a=0x0102;
小端模式
在記憶體中是這樣的:
------------------------>記憶體位址增大方向。
VS:
大端模式是這樣的;
------------------------->記憶體位址增大方向。
2.檢測當前主機位元組序程式:
#include <stdio.h> int main(){union{short s;char c[sizeof(short)];}un;un.s = 0x0102;if(sizeof(short) == 2){if(un.c[0] == 0x01 && un.c[1] == 0x02){printf("big-edian\n");}else if(un.c[0] == 0x02 && un.c[1] == 0x01){printf("little-edian\n");}else{printf("unknow\n");}}else{printf("sizeof(short) != 2,try other means!");}return 0;}
3.位元組序轉換
不同的系統可能用不同的模式,這樣通過網路在不同的系統間傳輸多位元組資料時就會出現資料解讀錯誤。幸好規定了網路位元組序(大端模式)。在網路上傳輸資料時,我們可以把資料從本地位元組序轉換到網路位元組序然後再發到網路上。從網路上接收到資料後轉化為本地位元組序。這樣我們就可以避免這些位元組序細節問題了。當然傳輸單位元組的字串時,不許用轉換位元組序。
windows和Linux平台都提供了轉換函式。在Linux下:
#include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t host32bitvalue); /*返回網路位元組序的值*/ uint16_t ntohs(uint16_t net16bitvalue); uint32_t ntohl(uint32_t net32bitvalue); /*返回主機位元組序的值*/
16:表示是16bit的值;32:表示是32bit的值;
s:短整數,即16bit; l:長整數,即32bit;
h:本地主機位元組; n:網路位元組;
4.大端模式和小端模式各自的優勢:
小端模式 :強制轉換資料不需要調整位元組內容,1、2、4位元組的儲存方式一樣。
大端模式 :符號位的判定固定為第一個位元組,容易判斷正負。
好像對大端小端模式的考察每年都是筆試題的熱點。
參考連結:詳解大端模式和小端模式