zoukankan      html  css  js  c++  java
  • htons

    在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
  • 相关阅读:
    Directx11教程(21) 修正程序最小化异常bug
    Directx教程(28) 简单的光照模型(7)
    Directx教程(22) 简单的光照模型(1)
    Directx教程(26) 简单的光照模型(5)
    Directx教程(25) 简单的光照模型(4)
    finit 1.5 发布,/sbin/init 的服务器监控器
    MySQL 8小时问题
    DataCleaner 3.0.1 发布,数据质量分析管理
    dedecms调用其它栏目列表
    ReportPlus:在iPad上创建和使用仪表盘及报表
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/5143865.html
Copyright © 2011-2022 走看看