處理器位元組大小端儲存方式 網路位元組順序(總結)

2021-07-25 19:28:57 字數 2221 閱讀 2875

1、大小端儲存方式

為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的

編譯器),另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。

大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。

小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。

例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於 大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。對於32bit的int型,如下:

0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000

0000440: b484 6c4e 004e ed00 0000 0000 0100 0000

在大端模式下,前32位應該這樣讀: e6 84 6c 4e ,在小端模式下,前32位應該這樣讀: 4e 6c 84 e6

我們常用的x86結構是小端模式,而keil c51則為大端模式。vc6.0編譯程式如下:

int i = 0x1234;

printf("&i address is %p\n", &i);

printf("&i+1 address is %p\n", &i+1);

printf("&i address data is %p\n\n",*(&i));

printf("(char*)&i address is %p\n", (char*)&i);

printf("(char*)&i+1 address is %p\n", (char*)&i+1);

printf("(char*)&i address data is %p\n", *(char*)&i);

printf("(char*)&i+1 address data is %p\n", *((char*)&i+1));

結果如下:

&i address  is 0012ff7c

&i+1 address  is 0012ff80

&i address data is 00001234

(char*)&i address is 0012ff7c

(char*)&i+1 address is 0012ff7d

(char*)&i address data is 00000034

(char*)&i+1 address data is 00000012

2、網路位元組順序

我們知道網路上的資料流是位元組流,對於乙個多位元組數值,在進行網路傳輸的時候,先傳遞哪個位元組?也就是說,當接收端收到第乙個位元組的時候,它是將這個位元組作為高位還是低位來處理呢?網路位元組序定義:收到的第乙個位元組被當作高位看待,這就要求傳送端傳送的第乙個位元組應當是高位。而在傳送端傳送資料時,傳送的第乙個位元組是該數字在記憶體中起始位址對應的位元組。可見多位元組數值在傳送前,在記憶體中數值應該以大端法存放。

比如我們經過網路傳送32bit整型資料0x12345678,在cortex-m3平台中,它是以小端法存放的,在傳送前需要使用系統提供的htonl將其轉換成大端法

存放。

lwip中位元組轉換函式:

uint32_t htonl(uint32_t hostlong);//32位的主機位元組序轉換到網路位元組序

uint16_t htons(uint16_t hostshort);//16位的主機位元組序轉換到網路位元組序

uint32_t ntohl(uint32_t netlong);//32位的網路位元組序轉換到主機位元組序

uint16_t ntohs(uint16_t netshort);//16位的網路位元組序轉換到主機位元組序

大小端 網路位元組序 本地位元組序問題

總結 1 80x86使用小端法 即本地位元組序 網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳...

大小端 網路位元組序問題

總結 1 80x86使用小端法,網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳送的buffer...

大小端問題網路位元組序

關於位元組序 大端法 小端法 的定義 unxi網路程式設計 定義 術語 小端 和 大端 表示多位元組值的哪一端 小端或大端 儲存在該值的起始位址。小端存在起始位址,即是小端位元組序 大端存在起始位址,即是大端位元組序。也可以說 1.小端法 little endian 就是低位位元組排放在記憶體的低位...