• 字节序相关问题简单总结,LSB与MSB


    细细碎碎的知识点还真是不少啊,今天总结下通信中的数据字节序的问题。

    先来认识名词:

    MSB:Most Significant Bit.    “最高有效位”

    LSB:Least Significant Bit.    “最低有效位”

    大端模式:Big Endian.

    小端模式:Little Endian.

    关于MSB和LSB的东西很简单,MSB指一个数据的二进制表示的最高有效位,LSB指数据的最低有效位,举个栗子看:

    1(MSB)001 1011(LSB)

    看到了吧,有点类似于十进制,如:13265(一万三千二百六十五),其中万位的1就是MSB,个位的5就是LSB。

    好了,这个就这样了。下面是大小端的区别。

    大端模式:一个多字节数据的高字节在前,低字节在后,以数据 0x1234ABCD 看例子:

         低地址   --------------------->   高地址

         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

         |    12    |    34    |    AB    |    CD    |

         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

    小端模式:一个多字节数据的低字节在前,高字节在后,仍以 0x1234ABCD 看:

         低地址   --------------------->   高地址

         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

         |    CD    |    AB   |    34    |    12    |

         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

    以上的例子应该比较形象了吧,大家可能会感觉大端模式比较符合人类的习惯啊,存储的顺序和直观理解的顺序是一样的。X86架构的CPU好想都是小端模式的....

    在项目编程中,我个人接触的都是小端模式,在传输数据的时候,组帧时都是把低字节数据放在数组的前边的,所以,不要太仇视小端模式。

    协议中如果写 “LSB first” ,这就是指数据传输时采用小端模式,所以,组帧不要错了哦。

    再附加一下怎么判断自己的PC是大端模式还是小端模式,看代码:

     1 #include <stdio.h>
     2 int main()
     3 {
     4     typedef union{
     5         int a;
     6         char b;
     7     }UN_TEST;    /* 定义一个联合体数据类型 */
     8 
     9     UN_TEST d;
    10     d.a = 1;
    11     if(d.b == 1)
    12     {
    13         printf("Little Endian\n");
    14     }
    15     else
    16     {
    17         printf("Big Endian\n");
    18     }
    19 
    20     return 0;
    21 }

    联合体的数据元素共用内存,所以你给int元素赋个1,如果是小端模式,它的存储就是 “ 01 00 00 00 ” 这样的;如果是大端模式,就是 “ 00 00 00 01 ” 这样的,所以通过判断char元素的值(共用内存,所以这个值占用的是第一个字节的地址)就可以得到了。

  • 相关阅读:
    添加绝对路径的链接
    css-------------控制溢出隐藏 换行用省略号表示
    引入公共头部 脚部
    入口图片放在浏览器正中间,点击之后缩小固定在浏览器一侧
    伪类 统一添加样式
    nav 鼠标移入当前高亮显示,其他消失
    17/9/6 bootstrap.css去掉后引发的样式错乱
    JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
    javascript特效实现——当前时间和倒计时效果
    使用DataTables导出excel表格
  • 原文地址:https://www.cnblogs.com/gklovexixi/p/5879802.html
Copyright © 2020-2023  润新知