大小端 位元組序問題

2021-08-13 17:43:40 字數 2123 閱讀 4188

大小端、位元組序問題

大小端解析

端模式出自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 以網路位元組序處理後再拷貝到傳...