大端、小端與網絡字節序


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM