為什麼存在這兩個東西:
空中傳輸的位元組的順序即網路位元組序為標準順序,考慮到與協議的一致以及與同類其它平台產品的互通,在程式中發資料報時,將主機位元組序轉換為網路位元組序,收資料報處將網路字 節序轉換為主機位元組序
網路程式開發時 或是跨平台開發時 應該注意保證只用一種位元組序 不然兩方的解釋不一樣就會產生bug
主機序:
不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序
1. little endian:將低序位元組儲存在起始位址
2. big endian:將高序位元組儲存在起始位址
le little-endian
最符合人的思維的位元組序
位址低位儲存值的低位
位址高位儲存值的高位
怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在記憶體位址小的地方,也即記憶體位址低位
反之,高位值就應該放在記憶體位址大的地方,也即記憶體位址高位
be big-endian
最直觀的位元組序
位址低位儲存值的高位
位址高位儲存值的低位
為什麼說直觀,不要考慮對應關係
只需要把記憶體位址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,乙個位元組乙個位元組的填充進去
網路序:
網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。
常用的轉換函式:
htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
例子:
。。。。。。struct
sockaddr_in client,server;
char
buf[max_len];
char
flag[max_len];
file *fq_send=null,*fq_rec=null;
int len,opt = 1;
if( ( sd = socket(af_inet,sock_stream,0)) == -1
)
bzero(&server,sizeof
(server));
server.sin_family =af_inet;
server.sin_port = htons(ser_port);//
將埠號的主機序轉為網路序
server.sin_addr.s_addr = inet_addr("
127.0.0.1");
setsockopt(sd,sol_socket,so_reuseaddr,&opt,sizeof
(opt));
if( connect(sd,(struct sockaddr *)&server,sizeof(server)) < 0
)
。。。。。。
主機序和網路序
不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1 little endian 將低序位元組儲存在起始位址 2 big endian 將高序位元組儲存在起始位址 le little endian 最符合人的思維的位元組序 位址低位儲存值的低...
主機序和網路序
不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1 little endian 將低序位元組儲存在起始位址 2 big endian 將高序位元組儲存在起始位址 le little endian 最符合人的思維的位元組序 位址低位儲存值的低...
主機位元組序和網路位元組序(大端序,小端序,網路序)
根據cpu的不同我們可以把主機位元組序在記憶體中儲存的順序叫做主機序,也就是我們常說的,大端機和小端機。我們經常看到的有兩種 1.小端機 記憶體中以小端序儲存的機器 將低位元組序儲存在開始的位址 及記憶體較小的記憶體 舉個例子 我們將記憶體從左到右排列 在記憶體中存放0x01020304 2000 ...