美文网首页
主机字节顺序HBO(Host Byte Order)

主机字节顺序HBO(Host Byte Order)

作者: taj3991 | 来源:发表于2019-12-24 18:57 被阅读0次

    网络字节顺序NBO(Network Byte Order)

    按从高到低的顺序存储,在网络上使用同一的网络字节顺序,可避免兼容性问题;

    主机字节顺序HBO(Host Byte Order)

    不同的机器HBO不相同,与CPU的设计有关,数据的顺序是由CPU决定的,而与操作系统无关;
    如Intel x86结构下,short型数0x1234表示为34 12,int型数0x12345678表示为78 56 34 12;
    如IBM power PC结构下,short型数0x1234表示为 12 34,int型数0x12345678表示为 12 34 56 78.
    由于这个原因,不同体系结构的机器之间不能直接通信,所以要转换成一种约定的顺序,也就是网络字节顺序,其实就是如同power pc那样的顺序。在PC开发中有ntohl和htonl函数可以用来进行网络字节和主机字节的转换

    linx系统下,htonl() htons() ntohl() ntohs()的头文件及函数定义如下:

    #include <arpa/inet.h>
    
    uint32_t htonl(uint32_t hostlong);
    
    uint16_t htons(uint16_t hostshort);
    
    uint32_t ntohl(uint32_t netlong);
    
    uint16_t ntohs(uint16_t netshort);
    

    在windows下,htonl() htons() ntohl() ntohs()的使用说明:

    ntohs()
    简述:

    将一个无符号短整形数从网络字节顺序转换为主机字节顺序。

    include <winsock.h>

    u_short PASCAL FAR ntohs( u_short netshort);
    netshort:一个以网络字节顺序表达的16位数。
    注释:本函数将一个16位数由网络字节顺序转换为主机字节顺序。
    返回值:ntohs()返回一个以主机字节顺序表达的数。

    htons()
    简述:将主机的无符号短整形数转换成网络字节顺序。
     #include <winsock.h>
     u_short PASCAL FAR htons( u_short hostshort);
     hostshort:主机字节顺序表达的16位数。
     注释:本函数将一个16位数从主机字节顺序转换成网络字节顺序。
     返回值:htons()返回一个网络字节顺序的值。

    htons和htonl都是把主机字节序转换成网络字节序。那什么时候用htons,什么时候用htonl??听网上说一个是16位一个是32位,但是如何去判断?假设servaddr.sin_port = htons(5555);用htonl可以吗?根据什么可以判断?

    根据要转换的值是否超过16位来决定,5555转换为2进制为1 0101 1011 0011 ,为13位,所以一般用htons,当然用htonl也可以;
    但是如果要转换的数 转换成2进制超过16位,则只能用htonl,此时如果用htons,16位以上的数舍去,造成数据值偏差。

    原文https://blog.csdn.net/qingkongyeyue/article/details/52921530

    相关文章

      网友评论

          本文标题:主机字节顺序HBO(Host Byte Order)

          本文链接:https://www.haomeiwen.com/subject/kcmfoctx.html