位元組序是指當乙個資料的長度超過乙個位元組時的儲存順序。
比如乙個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...