网络字节序和主机字节序详解(附代码)

文章介绍了网络字节序(大端字节序)和主机字节序的概念,以及在数据传输中统一使用网络字节序的重要性。同时,讲解了C/C++中htonl和ntohl函数在主机字节序与网络字节序转换中的作用,并提供了一个示例代码来演示转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、网络字节序和主机字节序

网络字节序主机字节序是计算机网络中常用的两种数据存储格式

主机字节序: 指的是在计算机内部存储数据时采用的字节排序方式。对于一个长为4个字节的整数,若采用大端字节序,则该整数在内存中的存储顺序是:以地址递增顺序依次存储其最高位到最低位的每个字节;若采用小端字节序,则该整数的字节则按照倒序的方式存储于内存中。

例如,在大端字节序中,数字127的存储方式如下:

3cef8744f65543ca8a7205bf8fd4314b.png

 网络字节序: 指的是一种标准的字节序,规定了数据在网络数据传输中采用的字节序,即大端字节序,也被称为网络序(Network Byte Order)。理由是因为不同的机器可能采用不同的主机字节序,而网络通信必须使用统一的字节序,这样才能保证不同系统之间的通信正常进行。

二、htonl()和ntohl

在C/C++语言中,可以使用函数htonl()ntohl()等将主机字节序转为网络字节序(大端字节序),并将网络字节序转换为主机字节序。其中,htonl()表示将32位整数从主机字节序转换为网络字节序,ntohl()则表示将32位整数从网络字节序转换为主机字节序,其他还有htons()ntohs()等类似的函数用于16位整型。

下面是一个简单的示例,演示了如何使用 htonl()ntohl() 函数将主机字节序和网络字节序相互转换

#include <stdio.h>
#include <arpa/inet.h> // 包含 htons() 和 ntohl() 函数的头文件

int main()
{
    unsigned int host_num = 0x12345678; // 本机使用的数据,被视为主机字节序
    unsigned int net_num = htonl(host_num); // 转换为网络字节序

    printf("host num: 0x%x\n", host_num);
    printf("net num: 0x%x\n", net_num);

    // 将网络字节序恢复为主机字节序
    unsigned int restored_num = ntohl(net_num);

    printf("restored num: 0x%x\n", restored_num);

    return 0;
}

运行结果如下所示:

host num: 0x12345678
net num: 0x78563412
restored num: 0x12345678

可以看到,在本机上调用 htonl() 函数将主机字节序转换为网络字节序后,输出的结果的顺序与我们期望的顺序完全相反。但在另一台计算机上接收到此数据时,这个字节序列就按照我们期望的大端字节序进行解释,最后恢复成原来的主机字节序。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MrWang.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值