大端(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...