精华内容
下载资源
问答
  • msb/lsb
    2021-05-17 15:50:51

    1、什么是MSB/LSB(big endian/little endian)

    LSB(Least Significant Bit),意为最低有效位。

    MSB(Most Significant Bit),意为最高有效位。若MSB=1,则表示数据为负值,若MSB=0,则表示数据为正。

    两大CPU派系指定的是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。

    小端字节序(little endian):低字节存于内存低地址,高字节存于内存高地址,对应LSB。
    大端字节序(big endian):高字节存于内存低地址,低字节存于内存高地址,对应MSB。

    例如一个数据0x0102,01是高位,02是低位。

    更多相关内容
  • C语言-MSB/LSB大小端序

    2022-04-26 19:40:45
    一、MSBLSB 首先我们要理解什么是MSBLSB。数据在计算机里面都是二进制存储的,二进制的最高位为MSB,最低位是LSBMSB:Most Significant Bit(最高有效位),也就是最高位,最左侧的bit。 LSB:Least ...

    一、MSB和LSB

            首先我们要理解什么是MSB和LSB。数据在计算机里面都是二进制存储的,二进制的最高位为MSB,最低位是LSB。

            MSB:Most Significant Bit(最高有效位),也就是最高位,最左侧的bit。

            LSB:Least Significant Bit(最低有效位),最低位,最右侧的bit。

    二、存储空间的高地址字节和低地址字节

            除了char之外,其他类型的变量空间基本上都有很多字节。int类型的变量空间为4个字节,每个字节都有字节的地址。

            地址最小的为低地址字节,地址最大的为高地址字节。

    三、测试电脑中大小端序

            这里采用联合体进行测试:

    #include <stdio.h>
    
    union un
    {
        int a;
        char b;
    }test;
    
    int main(void)
    {
        test.a = 0x12345678;     //  0x12     0x34     0x56     0x78
        printf("%x\n", test.b);  //?00010010 00110100 01010110 01111000?
    
        if(test.b == 0x78)
        {
            printf("Little-endain:LSB in low Byte\n");
        }
        else if(test.b == 0x12)
        {
            printf("Big-endain:MSB in low Byte\n");
        }
    
        return 0;
    }
    

            根据打印的结果就可以知道计算机的大小端序。

            测试的原理是:a有4个字节,b有一个字节,联合体的大小是最大成员变量a的大小。当a和b共用联合体空间的时候,都是从低地址开始共用空间的。

            如果是大端存放:0x12应该在就应该在低地址字节中,通过b访问以char类型来解释空间时,读到的数据就是0x12。

            如果是小端存放:0x78放在了低地址字节中,通过b访问以b类型来解释空间时,读到的数据就是0x78。

    四、通信中的大小端序

            默认串行通信,存在大小端问题。

            (1)串行传输时,如果先从MSB开始发送,这就是通信的大端序,通信大端序由于是MSB先被发送,因此也被称为MSB先行。

            (2)反之如果先从LSB开始发送,这就是通信的小端序,通信小端序由于是LSB先被发送,因此也被称为LSB先行。

    五、大小端序的转换

            分为4字节的大小端转换和2字节的大小端的转换。

    //2字节大小端转换
    uint16_t transfer_2bytes(uint16_t x)
    {
    	uint16_t buff = 0;
    	buff = (x << 8) | (x >> 8);//这个比较容易理解
    	return buff;
    }
    //4字节大小端转换
    uint32_t transfer_4bytes(uint32_t x)
    {	
    	uint32_t buff = 0;
    	buff = ((x & 0x00ff00ff) << 8) | ((x & 0xff00ff00) >> 8); //这里是关键
    	buff = ((buff & 0x0000ffff) << 16) | ((buff & 0xffff0000) >> 16);//同2字节转换
    	return buff;
    }
    

            

    展开全文
  • Intel和Motorola MSB/LSB

    千次阅读 2020-07-29 17:55:51
  • 大小端和MSB/LSB问题

    千次阅读 2019-05-26 16:08:11
    计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有...

    一、[C/C++]大小端字节序转换程序    转自:https://www.cnblogs.com/wuyepeng/p/9833273.html

    计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。

    大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

    小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

    例子:对于内存中存放的数0x12345678来说 
    如果是采用大端模式存放的,则其真实的数是:0x12345678 
    如果是采用小端模式存放的,则其真实的数是:0x78563412

    如果称某个系统所采用的字节序为主机字节序,则它可能是小端模式的,也可能是大端模式的。 
    而端口号和IP地址都是以网络字节序存储的,不是主机字节序,网络字节序都是大端模式。 
    要把主机字节序和网络字节序相互对应起来,需要对这两个字节存储优先顺序进行相互转化。 
    这里用到四个函数:htons(),ntohs(),htonl()和ntohl(). 
    这四个地址分别实现网络字节序和主机字节序的转化,这里的h代表host,n代表network,s代表short,l代表long。 
    通常16位的IP端口号用s代表,而IP地址用l来代表。

    1

    2

    3

    4

    5

    6

    #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);

    htonl 表示 host to network long ,用于将主机 unsigned int 型数据转换成网络字节顺序; 
    htons 表示 host to network short ,用于将主机 unsigned short 型数据转换成网络字节顺序; 
    ntohl、ntohs 的功能分别与 htonl、htons 相反。
     

     

     

    如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为0;取出低地址上的值,当其为1时则为小端模式,为0时为大端模式。

    //大小端模式的判断
    //方法一:利用联合体所有成员的起始位置一致,
    //对联合体中的int类型赋值,然后判断联合体中char类型的值的大小

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    #include <iostream>

    #include <iomanip>

    using namespace std;

     

    //signed

    typedef signed char        int8;

    typedef short              int16;

    typedef int                int32;

    typedef long long          int64;

    //unsigned

    typedef unsigned char      uint8;

    typedef unsigned short     uint16;

    typedef unsigned int       uint32;

    typedef unsigned long long uint64;

     

    #pragma pack(push)

    #pragma pack(1)//单字节对齐

    typedef struct{

        uint32 ID;

        uint32 Num;

        uint32 Type;

        uint32 lat;

        uint32 lng;

        uint32 alt;

        uint32 speed;

    }Waypoint;//Payload_Data

     

    #pragma pack(pop)

     

     

     

     

    void EndianSwap(uint8 *pData, int startIndex, int length);

     

     

     

    int main()

    {

     

        Waypoint wp,wp_ori;

        int len = sizeof(Waypoint);

        cout << "size of Waypoint: " << len << endl;

     

        wp.ID    = 0x00000011;

        wp.Num   = 0x00002200;

        wp.Type  = 0xDD0CB0AA;

        wp.lat   = 0x00330000;

        wp.lng   = 0x44000000;

        wp.alt   = 0xABCD1234;

        wp.speed = 0x12345678;

     

        wp_ori = wp;

     

     

        int i = 0;

        uint8* pData = (uint8*)(&wp);

        for (i = 0; i < len; i += 4)

        {

            EndianSwap(pData,i,4);

        }

     

     

        cout << endl;

        cout << uppercase << hex << "改变字节序前: 0x" << setfill('0') << setw(8) << wp_ori.ID << endl;

        cout << uppercase << hex << "改变字节序后: 0x" <<setfill('0') << setw(8) << wp.ID <<endl;

        cout << endl;

        cout << uppercase << hex << "改变字节序前: 0x" << setfill('0') << setw(8) << wp_ori.Num << endl;

        cout << uppercase << hex << "改变字节序后: 0x" << setfill('0') << setw(8) << wp.Num << endl;

        cout << endl;

        cout << uppercase << hex << "改变字节序前: 0x" << setfill('0') << setw(8) << wp_ori.Type << endl;

        cout << uppercase << hex << "改变字节序后: 0x" << setfill('0') << setw(8) << wp.Type << endl;

        cout << endl;

        cout << uppercase << hex << "改变字节序前: 0x" << setfill('0') << setw(8) << wp_ori.lat << endl;

        cout << uppercase << hex << "改变字节序后: 0x" << setfill('0') << setw(8) << wp.lat << endl;

        cout << endl;

        cout << uppercase << hex << "改变字节序前: 0x" << setfill('0') << setw(8) << wp_ori.lng << endl;

        cout << uppercase << hex << "改变字节序后: 0x" << setfill('0') << setw(8) << wp.lng << endl;

        cout << endl;

        cout << uppercase << hex << "改变字节序前: 0x" << setfill('0') << setw(8) << wp_ori.alt << endl;

        cout << uppercase << hex << "改变字节序后: 0x" << setfill('0') << setw(8) << wp.alt << endl;

        cout << endl;

        cout << uppercase << hex << "改变字节序前: 0x" << setfill('0') << setw(8) << wp_ori.speed << endl;

        cout << uppercase << hex << "改变字节序后: 0x" << setfill('0') << setw(8) << wp.speed << endl;

        return 0;

    }

     

    void EndianSwap(uint8 *pData, int startIndex, int length)

    {

        int i,cnt,end,start;

        cnt = length / 2;

        start = startIndex;

        end  = startIndex + length - 1;

        uint8 tmp;

        for (i = 0; i < cnt; i++)

        {

            tmp            = pData[start+i];

            pData[start+i] = pData[end-i];

            pData[end-i]   = tmp;

        }

    }

      运行结果如下:

     

    二、C/C++语言,对MSB、LSB的读/取处理      转自:https://blog.csdn.net/dijkstar/article/details/48765843

    1. 做硬件的都知道,串口是LSB优先,I2C、1553B是MSB优先,这里的MSB、LSB指的是二进制位的位置,区别于【字节序】(通信中,先发送低字节,还是高字节的问题,那叫大端big-endian、小端little-endian)

    如果需要自己来实现MSB、LSB的读取、转换,如何实现呢?下面给出C/C++程序:


    #include "stdio.h"
     
    #define BITS_WIDTH    (8)
     
    void main()
    {
        int val = 0;
        int i=0;
        //
        //接收:MSB在最左边,先进来
        //
        for (i=0; i<BITS_WIDTH; i++)
        {
            val<<=1;
            if(i==0 || i==7)//模拟第N位上有高位
                val++;
        }
        printf("接收MSB在最左边1,0x%x\n", val);
     
        //
        //接收:MSB在最左边,先进来
        //
        val = 0;
        for (i=0; i<BITS_WIDTH; i++)
        {
            if(i==0 || i==2)//模拟第N位上有高位
            {
                val |=1<<(BITS_WIDTH-1-i);
            }
        }
        printf("接收MSB在最左边2,0x%x\n", val);
     
        //
        //接收:LSB在最左边,先进来
        //
        val = 0;
        for (i=0; i<BITS_WIDTH; i++)
        {
            //模拟第N位上有高位
            if(i==0 || i==1)
            {
                val |=1<<i;
            }
        }
        printf("接收LSB在最左边,0x%x\n", val);
     
        printf("\n");
     
     
        //
        //发送: 先发送高位,后发送低位
        //
        val= 0x25;
        printf("发送数值0x%x按先高位后低位顺序: ", val);
        for (i=0; i<BITS_WIDTH; i++)
        {
            if ((val&0x80) == 0)
                printf("0, ");
            else 
                printf("1, ");
     
            val <<=1;
        }
        printf("\n");
     
     
        //
        //发送: 先发送低位,后发送高位
        //
        val= 0x25;
        printf("发送数值0x%x按先低位后高位顺序: ", val);
        for (i=0; i<BITS_WIDTH; i++)
        {
            if ((val&0x01) == 0)
                printf("0, ");
            else 
                printf("1, ");
            
            val >>=1;
        }
        printf("\n");
     
    }

    2. 字节序的大端、小端:
    x86系统用的是小端(little-endian),简单说:就是“先存储低字节,后存储高字节”,或者说“先低后高”

    例如:unsigned int xyz = 0x0A0B0C0D;

    内存中,先存储的0x0D, 0x0C, 0x0B,......,就是上面说的“先低后高”
     

    展开全文
  • 什么是MSB/LSB码?

    2019-10-07 06:54:10
    通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。 LSB(Least Significant Bit),意为最低有效位;MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示数据为负值,若MSB=0,则表...
  • 总结:大小端存储指字节在内存存储方式,X86、ARM平台都是小端存储(低-低),MSB/LSB只发送字节序或者比特序,串口是比特序LSB,IIC是比特序MSB。最后也有人将MSB、big-endian、大端发送都混为一谈,这时候一般指...
  • 【续】关于对MSB/LSB写0时的步骤

    千次阅读 2016-06-19 09:03:14
    好,可以看到场景D的结果就是该cell在被下次擦除之前,将永远处于D1态,因为MSBLSB都被写了,只不过LSB被写了0,MSB被写了1。 场景E: 基于场景C的结果,也就是D1态, 此后应用如果想将该cell的...
  • MSB/LSB

    2017-08-02 17:37:26
    通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。 LSB(Least Significant Bit),意为最低有效位;MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示数据为负值,若MSB=0,则表示数据为
  • 07 MSBLSB

    2020-02-04 11:02:30
    最高有效位(MSB - Most Significant Bit) 最高有效位(MSB) 指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字...汇编中,比如8位2进制数10000001,其中第一个1是MSB,第二个1是LSB。在计...
  • MSBLSB

    千次阅读 2018-09-29 11:05:46
    最高有效位(MSB)  指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之...
  • MSB/LSB 数据大小端

    千次阅读 2016-11-19 13:54:10
     其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。  用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储...
  • PCM 数据中的大/小端 与 MSB/LSB

    千次阅读 2014-07-02 11:58:30
    对于大端来说,字节0对应的就是DB31--DB24.MSBLSB优先则是以BIT为单位的,且是串行的概念,MSB优先是指串行接口中DB7先传,DB0最后传,LSB优先则恰好相反.
  • 通过最简便最通俗易懂的方式来阐述以上内容 以0X12345678为基准 大端模式: 低地址存放高字节数据,则数据存放为[0]=12 [1]=34 [2]=56 [3]=78 小端模式: 低地址存放低字节数据,则...LSB:Least Significan...
  • MSBLSB

    2022-01-20 14:18:29
    MSB 和 LSBMSBLSB例Little-Endian & Big-Endian MSB MSB : 最高有效位 最高有效位(the Most Significant Bit,msb),是指一个n位二进制数字中的n-1位,具有最高的权值2^n − 1。在大端序中,msb即指最左端的...
  • 加速度中的mg/LSB是什么意思

    千次阅读 2021-12-27 11:22:03
    MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示数据为负值,若MSB=0,则表示数据为正。 LSB的意思是最小有效位,为数字输出方式,一般我们可以用mg/LSB来表示灵敏度,举个例子来说,ADI的加速度...
  • MSBLSB,建议先看下面(其实就是大小端的问题)

    万次阅读 多人点赞 2016-10-20 17:29:33
    最高有效位(MSB) 指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对...汇编中,比如8位2进制数10000001,其中第一个1是MSB,第二个1是LSB。在计算机计算的时候用于判断的比如如果是整数那么小数点(实际
  • MSBLSB的含义

    千次阅读 2021-12-11 16:57:00
    MSBLSB是存在于二进制BIT中的计算机名词,MSB代表二进制中最高位(一般为符号位),LSB代表二进制中的最低位。
  • MSBLSB

    万次阅读 多人点赞 2018-05-30 13:12:17
    MSB与LSBMost Significant Bit, Last(Least) Significant Bit最高有效位(MSB) 指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的...MSB高位前导,LSB低位前导。谈到字节...
  • 摘要:内存的读写永远从低地址开始读/写,从低到高!从低到高!从低到高!内存的读写永远从低地址开始读/写!...串口是LSB优先,I2C是MSB优先,这里的MSBLSB指的是比特序,二进制位的位置,区别于【字节序
  • 关于MSB/LSB Big-Endian/Small-Endian的区别

    千次阅读 2010-04-17 10:00:00
    很多人写了很多代码,定义了很多文档,但可能却还不知道MSB/LSB Big-Endian/Small-Endian的区别。说来惭愧,本人也在此问题上犯了错误,故贴以明示 MSB:Most Significant Bit LSB:Lest Significant Bit 通常...
  • 大端模式、小端模式、高字节序、低字节序、MSBLSB之间对应的关系
  • Motorola_MSB_LSB

    千次阅读 2020-04-14 21:52:53
    最近同事给了一份CAN通信矩阵,看到其中"Byte Order"(排列格式)一栏给出的是"Motorola Msb"时比较疑惑,查看相关资料并结合以往项目经验,总结此文。 四个概念 这里需要理解以下四个概念 数据在存储器中的...
  • 大端序、小端序和MSBLSB的区别和举例 1.字节序序 不同平台上数据存储方式: 大端字节序、小端字节序 字节序就是一个多字节数据的低位置(一般是低8位)放置在存储单元的高有效位(高地址) 还是 低有效位(低地址) 的...
  • 1. 做硬件的都知道,串口是LSB优先,I2C、1553B是MSB优先,这里的MSBLSB指的是二进制位的位置,区别于【字节序】(通信中,先发送低字节,还是高字节的问题,那叫大端big-endian、小端little-endian)如果需要自己来...
  • 2.3 字节顺序 “ Motorola Forward LSB” 2.4 字节顺序 “ Motorola Forward MSB” 2.5 字节顺序 “Motorola Sequential” 2.6 字节顺序 “ Motorola Backward” 3 小结 4 结尾 关键字...
  • 如果把向量的位选取写成 vector[msb:lsb] 这种形式,下标 msblsb 中是不能出现变量的,Verilog 2001支持如下写法 //assign out=in[(sel*4+3):sel*4];(错误的写法) //assign out = {in[sel * 4 + 3], in[sel ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,369
精华内容 5,347
关键字:

msb/lsb