位元組序學習

2021-10-24 15:05:07 字數 2539 閱讀 6770

位元組序是指當乙個資料的長度超過乙個位元組時的儲存順序。

比如乙個int型的資料,所佔的位元組數為4,那麼在儲存的時候第乙個位元組的位址為0x00b8f9f0,這個int資料占用的四個位元組的位址為0x00b8f9f0,0x00b8f9f1,0x00b8f9f2,0x00b8f9f3。但是對於a的四個位元組的儲存順序,在不同的處理器上可能是不同的。

這裡位元組的低位和高位指:

比如int a = 0x01020304;

左邊的01為高位,右邊的04為低位這樣的順序

小端序:

0x04

0x03

0x02

0x01

0x00b8f9f0

0x00b8f9f1

0x00b8f9f2

0x00b8f9f3

大端序:

0x01

0x02

0x03

0x04

0x00b8f9f0

0x00b8f9f1

0x00b8f9f2

0x00b8f9f3

對於儲存和傳輸時的位元組序,分為本地序和網路序

本地序指計算機儲存的時候所採用的順序,包括大端序和小端序,網路序指網路傳輸時採用的位元組序,由於網路傳輸的標準化,所以一般是採用大端序。在傳送網路資料之前,需要把本地序轉換為網路序,也就是我們一般呼叫的htonl,htons函式將本地序轉換為網路序,接收資料時ntohl,ntohs將網路序轉為本地序。

int a = 0x01020304;

cout << "a:" << a << endl;

cout << "a(hex):" << hex << a << endl;

int8_t* b = (int8_t*)&a;

cout << "b[0]:" << hex << (int)*b << endl;

cout << "&b[0]:" << hex << (void*)b << endl;

b++;

cout << "b[1]:" << hex << (int)*b << endl;

cout << "&b[1]:" << hex << (void*)b << endl;

b++;

cout << "b[2]:" << hex << (int)*b << endl;

cout << "&b[2]:" << hex << (void*)b << endl;

b++;

cout << "b[3]:" << hex << (int)*b << endl;

cout << "&b[3]:" << hex << (void*)b << endl;

a = htonl(a);

cout << "\nafter htonl\na:" << a << endl;

cout << "a(hex):" << hex << a << endl;

int8_t* c = (int8_t*)&a;

cout << "c[0]:" << hex << (int)*c << endl;

cout << "&c[0]:" << hex << (void*)c << endl;

c++;

cout << "c[1]:" << hex << (int)*c << endl;

cout << "&c[1]:" << hex << (void*)c << endl;

c++;

cout << "c[2]:" << hex << (int)*c << endl;

cout << "&c[2]:" << hex << (void*)c << endl;

c++;

cout << "c[3]:" << hex << (int)*c << endl;

cout << "&c[3]:" << hex << (void*)c << endl;

輸出如下:

a:16909060

a(hex):1020304

b[0]:4

&b[0]:00fefb00

b[1]:3

&b[1]:00fefb01

b[2]:2

&b[2]:00fefb02

b[3]:1

&b[3]:00fefb03

after htonl

a:4030201

a(hex):4030201

c[0]:1

&c[0]:00fefb00

c[1]:2

&c[1]:00fefb01

c[2]:3

&c[2]:00fefb02

c[3]:4

&c[3]:00fefb03

我的電腦本地序為小端序,通過htonl轉化為大端序。

通過udp傳送的時候

包內資料轉換前為:

轉換後為:

在轉化後傳送的資料和原始資料值是一樣的。所以一般在傳輸和接收時最好轉換一下位元組序。

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

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

位元組序和網路位元組序

1 位元組序 由於不同的計算機系統採用不同的位元組序儲存資料,同樣乙個4位元組的32位整數,在記憶體中儲存的方式就不同.位元組序分為小尾位元組序 little endian 和大尾位元組序 big endian intel處理器大多數使用小尾位元組序,motorola處理器大多數使用大尾 big e...

位元組序和網路位元組序

1位元組序 由於不同的計算機系統採用不同的位元組序儲存資料,同樣乙個4位元組的32位整數,在記憶體中儲存的方式就不同.位元組序分為小尾位元組序 little endian 和大尾位元組序 big endian intel處理器大多數使用小尾位元組序,motorola處理器大多數使用大尾 big en...