网络通信中的大端序与小端序:字节序转换与htons函数详解
一、什么是网络字节序低位字节数据会存储到高地址处。
不同的计算机架构中,字节序可能存在差异。像 Intel x86 架构一般是小端序。另外一些架构通常是大端序。为避免不同架构间出现数据传输问题,像网络协议(如 TCP/IP)就规定使用大端序当作网络字节序。
二、字节序转换 1)主机字节序转换为网络字节序
htons 函数用于进行主机字节序到网络字节序的转换。htonl 函数也用于将主机字节序转换为网络字节序。
htons函数(Host toShort)
作用:用于将16位整数从主机字节序转换为网络字节序。
htonl函数(Host toLong)
作用:用于将32位整数从主机字节序转换为网络字节序。
代码示例:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="language-cpp">#include <stdio.h>
#include <a style='color:#0000CC;font-size:15px;' rpa/inet.h>
int main()
{
https://img2.baidu.com/it/u=1912655099,3784794151&fm=253&fmt=JPEG&app=138&f=JPEG?w=500&h=889
uint16_t hostShort = 0x1234;
定义了一个无符号 32 位整数变量 hostLong,其值为 0x12345678。
定义一个无符号 16 位整数 netShort;将 hostShort 通过网络字节序转换函数 htons 进行转换,转换后的结果赋值给 netShort 。
将主机长整型数 hostLong 转换为网络字节序的无符号 32 位整数 netLong ,通过 htonl 函数来实现 。
printf("原始短:0xx,网络短:0xx\n", hostShort, netShort);
printf("Original long 为 0xx,Network long 为 0xx。", hostLong, netLong);
return 0;
}</code></pre></p>
本计算机是小端存储字节,像 Intel x86 架构通常采用小端序。因为此原因,网络字节序和本机字节序是相反的。
2)网络字节序转换为主机字节序
ntohs 函数用于进行主机字节序到网络字节序的转换;htonl 函数也用于将主机字节序转换为网络字节序。
ntohs函数( to )
https://img0.baidu.com/it/u=3473697037,3769865740&fm=253&fmt=JPEG&app=138&f=PNG?w=535&h=500
作用:用于将16位整数从网络字节序转换为主机字节序。
ntohl函数( to Host Long)
作用:用于将32位整数从网络字节序转换为主机字节序。
代码示例:在上述代码的基础上往下写。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="language-cpp">将网络字节序的 short 类型数据转换为主机字节序的 short 类型数据,得到 backShort,其中 netShort 为网络字节序的 short 类型数据,通过 ntohs 函数进行转换。
获取网络字节序的长整型数据 netLong ,然后将其转换为主机字节序的无符号 32 位整型数据 backLong ,转换过程通过 ntohl 函数实现。
printf 函数输出了两个信息,一个是“Network short:0xx”,另一个是“Back to original:0xx”,并且分别对应着变量 netShort 和 backShort 的值。
printf 函数输出以下内容:"Network long:0xx",同时输出 "Back to original:0xx",并且分别传入参数 netLong 和 backLong。</code></pre></p>
运行结果:可以看到网络字节序和主机字节序是相反的。
总结:
通过上述代码,你能够实现并使用 htons 函数、htonl 函数、ntohs 函数和 ntohl 函数,以在主机字节序与网络字节序之间进行转换。这些函数在对网络数据包进行处理时是很有用的,尤其在涉及跨平台通信的情形下。运用标准库函数能够保证代码的可移植性与兼容性。
页:
[1]