当前位置:首页 科普知识 htons

htons

发布时间:2023-09-15 00:56:26

htons是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为高位字节存放在内存的低地址处。

htons介绍

htons是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为高位字节存放在内存的低地址处。

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用big-endian排序方式。

htons概述

在Windows和Linux网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序,以Windows下的代码为例:

#include<winsock2.h>u_short htons(u_short hostshort);

htons的功能:将一个无符号短整型的主机数值转换为网络字节顺序,即大尾顺序(big-endian)

参数u_short hostshort:

1、6位无符号整数

返回值:TCP/IP网络字节顺序.

不同的CPU有不同的字节顺序类型,这些字节顺序类型指的是整数在内存中保存的顺序,即主机字节顺序。常见的有两种:

序号

英文名

中文名

描述

1

big-endian

大尾顺序

地址的低位存储值的高位

2

little-endian

小尾顺序

地址的低位存储值的低位

htons示例

例1

而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在内存的低字节处。举个例子吧。假定你的数据是0x1234,

在网络字节顺序里 这个数据放到内存中就应该显示成

addr addr+1

0x12 0x34

而在x86电脑上,数据0x1234放到内存中实际是:

addr addr+1

0x34 0x12

htons 的用处就是把实际主机内存中的整数存放方式调整成网络字节顺序。

例2 C++代码示例

#include <winsock2.h>#include <iostream>#pragma comment(lib,"ws2_32.lib") using namespace std;int main(){    int a = 16, b;    b = htons(a);    cout << "a=" << a << endl;    cout << "b=" << b << endl;    return 0;}

运行的结果如图1

解释一下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。

htons其他信息

不同CPU上运行不同的操作系统,其主机字节顺序也是不同,参见下表:

处理器

操作系统

字节顺序

Alpha

全部

little-endian

HP-PA

NT

little-endian

HP-PA

UNIX

big-endian

Intelx86

全部

little-endian

MIPS

NT

little-endian

MIPS

UNIX

big-endian

PowerPC

NT

little-endian

PowerPC

非NT

big-endian

温馨提示:
本文【htons】由作者 爱百科 转载提供。 该文观点仅代表作者本人, 自学教育网 信息发布平台,仅提供信息存储空间服务, 若存在侵权问题,请及时联系管理员或作者进行删除。
(c)2008-2025 自学教育网 All Rights Reserved 汕头市灵创科技有限公司
粤ICP备2024240640号-6