主机字节序和网络字节序详解 深入解析主机字节序与网络字节序(2)
主机字节序和网络字节序详解
htons 函数即将一个 short 类型从本机字节序转换成网络字节序(Big Endian),你可以这么记忆这个函数:host to net short => htons,与这个函数类似的还有一系列将整型转网络字节序的函数(以 Linux 系统为例):
#include <arpa/inet.h>
//host to net long
uint32_t htonl(uint32_t hostlong);
//host to net short
uint16_t htons(uint16_t hostshort);
与此相反,当从网络上收到数据以后,如果需要将整数从网络字节序转换成本地字节序,也有对应的系列函数:
#include <arpa/inet.h>
//net to host long
uint32_t ntohl(uint32_t netlong);
//net to host short
uint16_t ntohs(uint16_t netshort);
这类转换函数的实现原理也很简单,以本地字节序转网络字节序为例,如果发现本机字节序就是网络字节序(即本机字节序就是大端编码)则什么也不做,反之将字节顺序互换。
那如何判断本机字节序是不是网络字节序呢?可以随意找一个 2 字节的十六进制数值测试一下,例如 0x1234,如果本机字节序是小头编码,这值 12 存储在高地址字节中,34 存储在低地址字节中,这样当强行把 0x1234 转换成 1 字节的 char 时,高字节被丢弃,剩下低字节值,就是 34;
反之,如果本机字节序是大端编码,则高地址字节中存储的是 34,低地址字节中存储的是 12,当强转成一个字节的 char 时,其值是 12,代码实现如下:
//判断本机是否是网络字节序
bool isNetByteOrder()
{
unsigned short mode = 0x1234;
char* pmode = (char*)&mode;
//低字节放低位 小端字节
if (*pmode == 0x34)
return false;
return true;
}
在上面的基础上,我们来实现一下 htons 函数:
uint16_t htons(uint16_t hostshort);
{
//如果已经本机字节序是网络字节序,则直接返回
if (isNetByteOrder())
return hostshort;
return ((uint16_t)(hostshort >> 8)) | ((uint16_t)((hostshort & 0x00ff) << 8));
}
其他的函数实现原理类似,读者可以自己实现一下,这里不再重复介绍。
操作系统提供的字节转换函数一览表
为了便于读者查阅,让我们对操作系统提供的这些函数进行一下汇总:
Windows平台:
#include <winsock2.h>
/**
* 本机字节序转网络字节序
*/
htou_short htons(u_short hostshort);
u_long htonl(u_long hostlong);
unsigned __int64 htonll(unsigned __int64 Value);
/**
* 网络字节序转本机字节序
*/
u_short ntohs(u_short netshort);
u_long ntohl(u_long netlong);
unsigned __int64 ntohll(unsigned __int64 Value);
注意:我们知道在 Windows 上使用 socket 函数需要先调用
相关阅读
-
802.11标准的技术特点有哪些?
如果想知道802.11标准的技术特点有哪些的内容,接下来分享详细内容。 802.11是一组无线局域网(WLAN)标准,由IEEE(Institute of Electrical and Electronics Engineers)制定和发布。 这些标准规定了无线网
-
首选dns的服务器地址是多少 手动设置IP地址和DNS
一篇IT技术小知识,为您介绍首选dns的服务器地址是多少和手动设置IP地址和DNS方面的知识,一起跟随小编看看吧! 现在IPV6现在离我们越来越近了,我们很多地方的网络运营商已经提供IPv6的网
-
用html5制作网页步骤 html做一个简单的网页教学
跟大家分享用html5制作网页步骤和html做一个简单的网页教学的IT知识,下面为详细的介绍。 网页是一个包含HTML标签的纯文本文件 网页制作离不开 浏览器 和 制作网页工具 浏览器推荐【谷歌浏
-
什么是混合云 有哪些优缺点?
本文核心导读:什么是混合云的电脑方面的小经验,接下来分享详细内容。 混合云结合了公共云和私有云的特点,允许数据和应用程序在两者之间进行流动。 混合云的多样性 混合云可以由多


