大端、小端、網絡字節序

網絡字節序(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

三、網絡字節序和主機序相互轉換函數

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章