htons
来源:互联网 发布:淘宝和拍拍网的区别 编辑:程序博客网 时间:2024/06/07 02:31
概述编辑
在Windows和Linux网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序,以Windows下的代码为例:
1
2
#include<winsock2.h>
u_shorthtons(u_shorthostshort);
htons的功能:将一个无符号短整型的主机数值转换为网络字节顺序,即大尾顺序(big-endian)
参数u_short hostshort:16位无符号整数
返回值:TCP/IP网络字节顺序.
不同的CPU有不同的字节顺序类型,这些字节顺序类型指的是整数在内存中保存的顺序,即主机字节顺序。常见的有两种:
序号
英文名
中文名
描述
1
big-endian
大尾顺序
地址的低位存储值的高位
2
little-endian
小尾顺序
地址的低位存储值的低位
htons 是将整型变量从主机字节顺序转变成网络字节顺序, 就是整数在地址空间存储方式变为:高位字节存放在内存的低地址处。
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释,网络字节顺序采用big-endian排序方式。
示例编辑
例1
而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在内存的低字节处。举个例子吧。假定你的数据是0x1234,
在网络字节顺序里 这个数据放到内存中就应该显示成
addr addr+1
0x12 0x34
而在x86电脑上,数据0x1234放到内存中实际是:
addr addr+1
0x34 0x12
htons 的用处就是把实际主机内存中的整数存放方式调整成网络字节顺序。
例2
我们在Intel机器下,执行以下程序
1
2
3
4
5
6
7
8
9
10
11
12
13
voidmain()
{
inta=16,b;
b=htons(a);
cout<<
"a="
<<a<<endl;
cout<<
"b="
<<b<<endl;
1
}
运行的结果如下图
解释一下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。
Tips编辑
不同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
[1]
0 0
- htons
- htons
- htons
- htons
- htons
- htons
- htons(), ntohl(), ntohs(),htons()
- htons(), ntohl(), ntohs(),htons()
- htons(), ntohl(), ntohs(),htons()
- htons函数
- htons()用法
- 关于htons;
- htonl htons
- htons htonl
- htons()函数
- htons(), ntohl(), ntohs(),htons() 函数
- htons(), ntohl(), ntohs(),htons() 函数
- htons(), ntohl(), ntohs(),htons() 函数
- jQuery Mobile学习
- IOS 颜色转换成UIImage
- 线程等待与线程的返回值
- Android,使用activity与fragment的小结与使用的细节
- 小三角如何实现--css-before-after
- htons
- android 刷新媒体库(版本判断)
- 如何实现新闻详情页面
- python之open()函数
- 学习
- Myeclipse中package,source folder,folder区别
- 7 种将字符串反转的 Java 方法
- Objective-C MD5加密方法
- 浅谈Spring AOP