主机字节序与网络字节序的转换

本文深入探讨了主机字节序与网络字节序的区别,解释了如何通过编程判断主机字节序,并介绍了用于转换数据格式的函数,确保在计算机网络通信中数据的一致性和正确性。

前言

  我们知道,数据在主机内的存放有两种模式,也就是说,主机字节序有两种:大端和小端( 这里假定读者已经清楚这个问题 )。但在网络通信中,要求通信数据( 通信数据这里指IP号和端口号 )的使用必须用网络字节序。什么又是网络字节序?网络字节序可以理解为主机字节序的大端模式。如果你的主机字节序原本就是大端模式,那么你可以考虑不用将通信数据转换为网络字节序;但如果你的主机字节序是小端,那么通信数据必须被下面提及到的其中某个函数进行处理,转换成网络字节序后方可使用( 即存放进套接字地址结构变量 )。

查看主机字节序

  运行下面一段小程序即可查看你的主机字节序( 注释略 )

 1 #include <stdio.h>
 2 
 3 int main(int argc, char **argv)
 4 {
 5     union {
 6         short s;
 7         char c[sizeof(short)];
 8     } un;
 9 
10     un.s = 0x0102;
11     if (un.c[0] == 1 && un.c[1] == 2) {
12         puts("字节序为小端");
13     }
14     else if (un.c[0] == 2 && un.c[1] == 1) {
15         puts("字节序为大端");
16     }
17     else {
18         puts("字节序未知");
19     }
20 
21     return 0;
22 }

  本机运行情况:

  

转换函数

  以下几个转换函数均包含在头文件 netinet/in.h

  1. uint16_t htons ( uint16_t host16bitvalue )

  将16位的主机字节序无符号整型变量转换为网络字节序格式

  2. uint32_t htonl ( uint32_t host32bitvalue )

  将32位的主机字节序无符号整型变量转换为网络字节序格式

  3. uint16_t ntohs ( uint16_t net16bitvalue )

  将16位的网络字节序无符号整型变量转换为主机字节序格式

  4. uint32_t ntohl ( uint32_t net32bitvalue )

  将32位的网络字节序无符号整型变量转换为主机字节序格式

说明

  以上函数中" h "代表主机字节序;" n "代表网络字节序;" s "代表16位的无符号整型变量( 往往是端口 );" l “代表32位的无符号整型变量( 往往是Ipv4地址 )。

 

 

转载于:https://www.cnblogs.com/scut-fm/p/3323289.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值