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