位元組序相關問題

2021-07-29 09:38:05 字數 1000 閱讀 6478

計算機系統一般採用位元組(octet,8 bit )作為邏輯定址單位。當物理單位的長度大於1個位元組時,就要區分位元組順序。常見的位元組順序有兩種:大端big endian 和 小端 little endian。

大端序:高位位元組放到記憶體的低位址端,低位位元組排放在記憶體的高位址段; 

判斷大端小段(c++):

棧位址的申請是由高到低的!!!

const int endian = 1;

#define is_bigendian() ((*(char*)&endian) == 0)

#define is_littlendian() ((*(char*)&endian) == 1)

bool islittleendian()

u; u.val = 1;

if(u.c == 1)

else

}

按照從高到低的順序儲存,在網路上使用統一的網路位元組順序,可以避免相容性問題。(即為大端序,tcp/ip中使用的位元組序)。

不同的機器hbo不相同,與cpu設計有關。不同機器之間通訊,需要轉換為網路位元組序來通訊。相關轉換函式如下:

htonl():將主機位元組順序轉化為32位網路位元組順序

ntohl():將網路位元組順序轉換為32位主機位元組順序

htons():將乙個16位數從主機位元組順序轉化為網路位元組順序

ntohs():將乙個無符號端整型數從網路位元組順序轉換為主機位元組順序

inet_ntoa():將網路位址轉換成"."點隔的字串格式,返回乙個字元指標

inet_addr():將ip從點數格式轉換成無符號長整型(錯誤返回-1,與ip位址255.255.255.255相符合)

網路位元組序與主機位元組序及相關函式

為了弄明白這個位元組序的區分,我們首先需要知道為什麼會有這兩種位元組序。根本原因在於多位元組資料的儲存方式,即大小端問題。假設有乙個四位元組的 int 物件 int a 01020304 16 01020304 16 a 的最低位元組為 0416 0416 最高位元組為 0116 0116 其儲存的...

位元組序問題 Endianness

特別強調 只有多位元組物件才會有多位元組問題,單位元組物件是不存在這個問題的多位元組物件 比如int 一般為4個位元組 float,short 一般兩個位元組 等 多位元組物件就不同了,因為他有多個位元組,然後順序的問題就出現了,就像排列組合一樣,多個元素排列方法多種多樣 位元組序只用到兩種特殊的排...

關於位元組序問題

位元組序分為主機位元組序和網路位元組序。主機位元組序主要分為兩種 大端位元組序 big endian 和小端位元組序 little endian 不同的處理器架構,有不同的位元組序。執行在同一臺計算機上的程序相互通訊時,一般不用考慮位元組序問題。位元組序是乙個處理器架構特性,用於指示像整數這樣的大資...