zoukankan      html  css  js  c++  java
  • 在终端模式和网络字节顺序的大小

    一、为什么会出现大小端模式?
    不同的cpu採用的大小端模式不一致。

    X86是小端模式。而KEIL C51则为大端模式。非常多的ARM。DSP都为小端模式。

    有些ARM处理器还能够由硬件来选择是大端模式还是小端模式。


    二、大小端模式的不同带来的问题是什么?怎样解决?
    假设存在数据网络传输。假设大小端模式不一致,假设不经过转换。必定会导致数据不致,出现错误。
    解决方法:统一将网络上传输的字节序採用同一种模式(大家都知道的),这样收发数据时,就会依据主机相应的模式是否和网络字节相应的模式一致,来推断是否须要进行转换。

    这样即使不同的设备使用不同的模式,网络传输不会出现故障。


    三、怎样推断cpu的大小端模式?
    有多种方法,列举三种。
    (1)、採用联合
    // 返回真,就是小端
    bool LittleEndian()
    {
            union
            {
                    int i;
                    char c;
            }udata;
            udata.i = 1;
            return (udata.c == 1);
    }

    (2)、通过指针推断
    bool LittleEndian()
    {
            int d = 0x12345678;
            char* p = *(char*)&d;
            return (*p == 0x78);
    }

    (3)、在linux环境下,通过htonl等函数直接推断。
     #include <arpa/inet.h>
    bool LittleEndian()
    {
            return (1!=htonl(1));
    }

    四、网络字节序

    因为不同的系统会有不同的模式,为了统一。规定在网络传输中使用大端模式。这就是网络字节序。如今看看以下这四个函数的作用

    uint32_t htonl(uint32_t hostlong);//32位的主机字节序转换到网络字节序
    uint16_t htons(uint16_t hostshort);//16位的主机字节序转换到网络字节序
    uint32_t ntohl(uint32_t netlong);//32位的网络字节序转换到主机字节序
    uint16_t ntohs(uint16_t netshort);//16位的网络字节序转换到主机字节序

    拿htonl和ntohl来分析,htonl函数的内部实现原理是这样,先推断主机是什么模式存储,假设是大端模式,就跟网络字节序一致,直接返回參数就可以,假设是小端模式。则把形參转换成大端模式存储在一个暂时參数内,再把暂时參数返回;而ntohl函数的实现原理也是一样的过程,可是要注意它的參数,參数是网络字节序,就是大端模式存储,而无论你传入实參的过程是假设存储的。因此当推断主机是大端模式的时候。会直接返回,由于该函数默认会觉得形參是网络字节序,把它当大端模式来看。假设推断主机是小端模式,就会将实參做转换,转换的过程并不复杂,就是逆序存储各个字节的数据,所以结果就被转换。

    讲到这里,能够看出一个规律来。就是假设主机与网络字节序不一致(也就是小端模式),这四个函数的返回值与传递进去的实參值的字节排序肯定是逆序的,所以返回值绝对不等于实參值。比如htonl(1)的结果肯定不是1,而假设主机与网络字节序一致(也就是大端模式),则这四个函数根本就没有做转换操作,而是直接返回实參值,这样他们的返回结果就肯定与实參值同样,即htonl(1)的结果是1。

    这样,我们就得到了一个很简便的推断系统是什么模式的方法。就是直接利用这四个函数来推断。如

    if (1 != htonl(1)) {
        //小端模式,作对应处理
    } else {
        //大端模式,作对应处理
    }

    或者直接用一个推断if(1 != htonl(1))。仅仅有主机字节序与网络字节序不一致时,才调用那些函数转换,否则,不需要治疗,这可以减少额外的函数调用。

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    CSS filter属性
    css过渡的使用
    关于2D、3D的转换
    3D立体旋转
    css的规范命名
    html标签的简单总结
    css之简单动画
    几种动态的学习链接
    css之规范命名
    css
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4854133.html
Copyright © 2011-2022 走看看