網路傳輸大端序 大端 小端與網路位元組序

2021-10-19 06:41:42 字數 2175 閱讀 7392

大端(big-endian),小端(little-endian)以及網路位元組序的概念在程式設計中經常會遇到。網路位元組序(network byte order)一般是指大端(big-endian,對大部分網路傳輸協議而言)傳輸,大端小端的概念是面向多位元組資料型別的儲存方式定義的,小端就是低位在前(低位位元組存在記憶體低位址,位元組高低順序和記憶體高低位址順序相同),大端就是高位在前,(其中「前」是指靠近記憶體低位址,儲存在硬碟上就是先寫那個位元組)。概念上位元組序也叫主機序。

一、大小端概念

首先大小端是面向多位元組型別定義的,比如2位元組、4位元組、8位元組整型、長整型、浮點型等,單位元組的字串一般不用考慮。

大端小端儲存、傳輸、以及接收處理需要對應。

大端(big-endian)就是高位元組(msb)在前,記憶體儲存體現上,資料的高位更加靠近低位址。(低位址存高位元組)——人類常用習慣的方式,網路、儲存中常用。

小端(little-endian)就是低位元組(lsb)在前,記憶體儲存體現上,資料的低位更加靠近低位址。(低位址存低位元組)——機器效率高儲存方式

網路位元組序一般是指大端傳輸,人們常用數字讀取方式也是大端。

二、大小端儲存示例

假設乙個32位 unsigned int型資料0x12 34 56 78,大小端8位儲存方式如下:

大端儲存方式為0x12 34 56 78(0x12所在位置為低位址,同時是資料大小的高位)

小端儲存方式為0x78 56 34 12,如下圖。

三、常見cpu的大小端儲存方式

不同cpu有不同的位元組序型別,典型的使用小端儲存的cpu有:intel x86和arm 。典型的使用大端儲存cpu有:power pc、mips unix和hp-pa unix。以上cpu需根據具體型號查詢手冊,有的cpu甚至可能同時能支援兩種儲存方式。

注:上文說的網路位元組順序則是表示網路傳輸時的位元組序,按照tcp/ip協議是按照大端傳輸方式,也就是高位元組先走(先傳12,接著34,56,78),這跟本機儲存和伺服器儲存沒有關係,只要確保雙方解析對應即可。

四、四個轉換函式

c/c++中有如下四個常用的轉換函式,這四個函式在小端系統中生效,大端系統由於和網路位元組序相同,所以無需轉換。

htons —— 把unsigned short型別從主機序轉成網路位元組序

ntohs —— 把unsigned short型別從網路位元組序轉成主機序

htonl —— 把unsigned long型別從主機序轉成網路位元組序

ntohl —— 把unsigned long型別從網路位元組序轉成主機序

以上函式包含標頭檔案:

#if defined(_linux) || defined(_darwin)

#include

#endif

#ifdef win32

#include

#endif

//判斷是否大小端函式

#include

#indlue

void main(int argc, char* ar**)

dword dwsmallnum = 0x01020304;

if(*(*byte)&dwsmallnum == 0x01)

printf(「big sequence.\r\n」);

else

printf(「small sequence.\r\n」);

#if defined(_linux) || defined(_darwin)

#include

#endif

#ifdef win32

#include

#endif

//判斷是否大小端函式

#include

#indlue

voidmain(intargc,char*ar**)

dworddwsmallnum=0x01020304;

if(*(*byte)&dwsmallnum==0x01)

printf(「bigsequence.\r\n」);

else

printf(「smallsequence.\r\n」);

讚賞

大端序與小端序

簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如int,double等,就要考慮儲存的順序了。注意位元組序是硬體層面的東西,對於軟體來說通常是透明的。再說白一點,位元組序通常只和你使用的處理器架構有關,而和程式語言無關,比如常見的intel x8...

大端序與小端序

簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如int,double等,就要考慮儲存的順序 了。注意位元組序是硬體層面的東西,對於軟體來說通常是透明的。再說白一點,位元組序通常只和你使用的處理器架構有關,而和程式語言無關,比如常見的 intel ...

大端序與小端序

簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如int,double等,就要考慮儲存的順序了。注意位元組序是硬體層面的東西,對於軟體來說通常是透明的。再說白一點,位元組序通常只和你使用的處理器架構有關,而和程式語言無關,比如常見的intel x8...