通过位偏移从十六进制解包Dec

通过位偏移从十六进制解包Dec,c,bitmap,hex,decimal,offset,C,Bitmap,Hex,Decimal,Offset,我有一个包含传感器设置的十六进制数据块,我将包括十六进制的开头片段(首先是LSB): F501517C 8150D4DE 04010200 70010101 05F32A04 F44670000000 AFF 0502D402 这直接来自将十六进制解码为dec的文档: 3.1. 完整标识符和设置记录(0x7C) 3.1.1完整标识符 3.1.2设置 这是我要破译的唯一信息。偏移量列必须是理解这一点的诀窍 十六进制值的偏移量是多少 我在第一个十六进制字符串中看到7C 设置部分变为十进制0x27

我有一个包含传感器设置的十六进制数据块,我将包括十六进制的开头片段(首先是LSB):


F501517C 8150D4DE 04010200 70010101 05F32A04 F44670000000 AFF 0502D402


这直接来自将十六进制解码为dec的文档:

3.1. 完整标识符和设置记录(0x7C) 3.1.1完整标识符 3.1.2设置 这是我要破译的唯一信息。偏移量列必须是理解这一点的诀窍

  • 十六进制值的偏移量是多少
  • 我在第一个十六进制字符串中看到7C
  • 设置部分变为十进制0x27=39,在3.1部分中规定长度为40

  • 给定的十六进制字节是距数据开头的字节偏移量

    假设给定的转储是little endian 32位,让我们看看:

    Value in dump - separated in bytes - bytes in memory
    F501517C      - F5 01 51 7C        - 7C 51 01 F5
    8150D4DE      - 81 50 D4 DE        - DE D4 50 81
    04010200      - 04 01 02 00        - 00 02 01 04
    
    现在,让我们将它们分配给字段。下一个列表连接了两条记录

    Byte  Offset      Field description
    
    7C    0x00        Product Type
    51    0x01        Device Type
    01    0x02        Software Major Version
    F5    0x03        Software Minor Version
    DE    0x04        Hardware Major Version
    D4    0x05        Hardware Minor Version
    
    Byte  Offset   Length(bit)   Offset(bit)  Default value   Min   Max     Field Description
    50    0x00     8             0            0               0     255     Country number
    81    0x01     8             0            0               0     255     District number
    00,02 0x02     16            0            0               0     9999    Sensor number
    
    结果是否合理,取决于您的决定:

    • 产品类型=0x7C
    • 设备类型=0x51=81十进制(也可以是ASCII“Q”)
    • 软件主版本。次版本=0x01.0xF5=1.245十进制
    • 硬件主要版本。次要版本=0xDE.0xD4=222.212
    • 国家编号=0x50=80十进制(也可以是ASCII“P”)
    • 地区编号=0x81=129十进制(可能0x01=1,设置位7?)
    • 传感器编号=0x0002=2十进制(假定为大端)

    您是如何获得十六进制代码片段的?你说LSB是第一个,但内存中哪个字节是第一个?您是否使用了小型endian机器并打印了
    uint32\t
    ?每个数据记录都会首先保存到内存LSB中。我通过串口下载数据记录。我通过二进制查看器软件打开.bin文件。数据在软件中以Hexa格式显示-4字节-小尾端。内存中的第一个字节是F501517C。这不是一个字节,而是一个32位的值。内存中的第一个字节是0x7C吗?啊,对。当以1字节格式显示时,它看起来像这样,7C 51 01 F5。谢谢你的回答。很抱歉让你有些困惑,可能是在你解密结果的时候。但是,它帮助了我,干杯!不客气!允许时请回来标记。
    Offset   Length(bit)   Offset(bit)  Default value   Min   Max     Field Description
    0x00     8             0            0               0     255     Country number
    0x01     8             0            0               0     255     District number
    0x02     16            0            0               0     9999    Sensor number
    ...
    0x27
    
    Value in dump - separated in bytes - bytes in memory
    F501517C      - F5 01 51 7C        - 7C 51 01 F5
    8150D4DE      - 81 50 D4 DE        - DE D4 50 81
    04010200      - 04 01 02 00        - 00 02 01 04
    
    Byte  Offset      Field description
    
    7C    0x00        Product Type
    51    0x01        Device Type
    01    0x02        Software Major Version
    F5    0x03        Software Minor Version
    DE    0x04        Hardware Major Version
    D4    0x05        Hardware Minor Version
    
    Byte  Offset   Length(bit)   Offset(bit)  Default value   Min   Max     Field Description
    50    0x00     8             0            0               0     255     Country number
    81    0x01     8             0            0               0     255     District number
    00,02 0x02     16            0            0               0     9999    Sensor number