大端(Big-Endian),小端(Little-Endian)以及網絡字節序的概念在編程中經常會遇到,網絡字節序(Network Byte Order)一般是指大端(Big-Endian,對大部分網絡傳輸協議而言)傳輸,大端小端的概念是面向多字節數據類型的存儲方式定義的,小端就是低位在前(低位字節存在內存低地址,字節高低順序和內存高低地址順序相同),大端就是高位在前,(其中“前”是指靠近內存低地址,存儲在硬盤上就是先寫那個字節)。概念上字節序也叫主機序。
一、大小端概念
1、首先大小端是面向多字節類型定義的,比如2字節、4字節、8字節整型、長整型、浮點型等,單字節的字符串一般不用考慮。
2、大端小端存儲、傳輸、以及接收處理需要對應。
3、大端(Big-Endian)就是高字節(MSB)在前,內存存儲體現上,數據的高位更加靠近低地址。(低地址存高字節)
4、小端(Little-Endian)就是低字節(LSB)在前,內存存儲體現上,數據的低位更加靠近低地址。(低地址存低字節)
5、網絡字節序一般是指大端傳輸。
二、大小端存儲示例
假設一個32位 unsigned int型數據0x12 34 56 78,大小端8位存儲方式如下:
- 大端存儲方式為0x12 34 56 78
- 小端存儲方式為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 <netinet/in.h> #endif #ifdef WIN32 #include <WINSOCK2.H> #endif
