大小端、位元組序問題
大小端解析
端模式出自jonathan swift書寫的《格列佛遊記》一書,這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian。小人國的內戰就源於吃雞蛋時是究竟從大頭(big-endian)敲開還是從小頭(little-endian)敲開。
在計算機業big endian和little endian也幾乎引起一場戰爭。在計算機業界,endian表示資料在儲存器中的存放順序。
大端:高位存在低位址,低位存在高位址;
小端:高位存在高位址,低位存在低位址;(intel的x86,arm普遍都是屬於小端)
舉個例子,從記憶體位址0x0000開始有以下資料
0x0000 0x12
0x0001 0x34
0x0002 0xab
0x0003 0xcd
如果我們去讀取乙個位址為0x0000的四個位元組變數:
若位元組序為big-endian,則讀出結果為0x1234abcd;
若位元組序位little-endian,則讀出結果為0xcdab3412.
如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為:
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
判斷大小端的函式
int checkcpuendian()//返回1,為小端;反之,為大端;
c;
c.a = 1;
return 1 == c.b;
}網路位元組序
我們知道網路上的資料流是位元組流,對於乙個多位元組數值,在進行網路傳輸的時候,先傳遞哪個位元組?也就是說,當接收端收到第乙個位元組的時候,它是將這個位元組作為高位還是低位來處理呢?
資料在網路傳輸的過程中,也就是說: 從主機a到主機b進行通訊,
a的固有資料儲存---->標準化---->轉化成b的固有格式
注: 標準化就是網路位元組序(也是大端位元組序)
網路位元組序定義:收到的第乙個位元組被當作高位看待,這就要求傳送端傳送的第乙個位元組應當是高位。而在傳送端傳送資料時,傳送的第乙個位元組是該數字在記憶體中起始位址對應的位元組。可見多位元組數值在傳送前,在記憶體中數值應該以大端法存放。
在實際的工程應用中,無論主機a和b的位元組序,是否一樣,為了程式的可移植性和相容性,都建議資料傳送主機進行主機位元組序到網路位元組序的轉換,資料接收機進行網路位元組序到主機位元組序的轉換。在c++中,有4個函式可以實現主機位元組序到網路位元組序的相互轉換,如下:
htons: 把unsigned short型別從主機序轉換到網路序
htonl: 把unsigned long型別從主機序轉換到網路序
ntohs: 把unsigned short型別從網路序轉換到主機序
ntohl: 把unsigned long型別從網路序轉換到主機序
位元組序的轉換
1. linux + c++ 實現主機位元組序和網路位元組序的轉換**
#include //1.包含arpa/inet.h
#include
int main()
output:
netport=1880555520
hostport=6000
2. windows + c++ 實現主機位元組序和網路位元組序的轉換**
#include
#include //1.包含,
#pragma comment( lib, "ws2_32.lib") //2.引入ws2_32.lib庫
void main()
output:
netport=1880555520
hostport=6000
大小端,位元組序問題
總結 1 80x86使用小端法,網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳送的buffer...
大小端位元組序問題
大端模式 big endian 資料的高位元組儲存在記憶體低位址中,而資料的低位元組則存放在記憶體高位址中。與思維習慣不一致,但與實際資料的表達方式一致。如powerpc的unix系統 小端模式 little endian 資料的高位元組儲存在記憶體高位址中,而資料的低位元組則存放在記憶體低位址中 ...
大小端 網路位元組序 本地位元組序問題
總結 1 80x86使用小端法 即本地位元組序 網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳...