IT袋

当前位置:主页 > 经验教程 > 建站编程 >

主机字节序和网络字节序详解

主机字节序和网络字节序详解 深入解析主机字节序与网络字节序(2)

时间:2024-01-09 16:00:42 来源:IT袋 作者:马勇
导读:主机字节序和网络字节序详解,htons  函数即将一个 short 类型从本机字节序转换成网络字节序( Big Endian ),你可以这么记忆这个函数: h ost  to   n et  s hort => htons,与这个函数类似的

主机字节序和网络字节序详解

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标准的技术特点有哪些的内容,接下来分享详细内容。 802.11是一组无线局域网(WLAN)标准,由IEEE(Institute of Electrical and Electronics Engineers)制定和发布。 这些标准规定了无线网

  • 首选dns的服务器地址是多少 手动设置IP地址和DNS

    首选dns的服务器地址是多少 手动设置IP地址和DNS

    一篇IT技术小知识,为您介绍首选dns的服务器地址是多少和手动设置IP地址和DNS方面的知识,一起跟随小编看看吧! 现在IPV6现在离我们越来越近了,我们很多地方的网络运营商已经提供IPv6的网

  • 用html5制作网页步骤 html做一个简单的网页教学

    用html5制作网页步骤 html做一个简单的网页教学

    跟大家分享用html5制作网页步骤和html做一个简单的网页教学的IT知识,下面为详细的介绍。 网页是一个包含HTML标签的纯文本文件 网页制作离不开 浏览器 和 制作网页工具 浏览器推荐【谷歌浏

  • 什么是混合云 有哪些优缺点?

    什么是混合云 有哪些优缺点?

    本文核心导读:什么是混合云的电脑方面的小经验,接下来分享详细内容。 混合云结合了公共云和私有云的特点,允许数据和应用程序在两者之间进行流动。 混合云的多样性 混合云可以由多