【问题标题】:Unpack Dec from Hex - via bit offsets从十六进制解包十进制 - 通过位偏移
【发布时间】:2020-06-30 19:20:24
【问题描述】:

我有一个包含传感器设置的十六进制数据块,我将包含十六进制的开始 sn-p(LSB 在前):


F501517C 8150D4DE 04010200 70010101 05F32A04 F4467000 00000AFF 0502D402


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

3.1. 完整的标识符和设置记录 (0x7C)

Offset   Length (bytes)    Field description

0x00     6                 Full identifier
0x06     40                Settings

3.1.1 完整标识符

Offset      Field description

0x00        Product Type
0x01        Device Type
0x02        Software Major Version
0x03        Software Minor Version
0x04        Hardware Major Version
0x05        Hardware Minor Version

3.1.2 设置

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

这是我必须解码的唯一信息。偏移列必须是理解这一点的诀窍。

  1. 十六进制值的偏移量是多少?
  2. 我在第一个十六进制字符串中看到 7C。
  3. 设置部分以十进制表示 0x27 = 39,在 3.1 部分中表示长度为 40。

【问题讨论】:

  • 你是如何得到十六进制 sn-p 的?你说LSB在前,但是内存中哪个字节在前呢?你是用小端机器打印uint32_t吗?
  • 每条数据记录首先保存到内存 LSB。我通过串口下载数据记录。我通过 Binary Viewer 软件打开 .bin 文件。数据在软件中以 Hexa 格式 - 4 字节 - little endian 显示。内存中的第一个字节是 F501517C。
  • 嗯,那不是 byte,它是一个 32 位的值。内存中的第一个字节是 0x7C 吗?
  • 啊,对。当以 1 字节格式显示时,它看起来像这样,7C 51 01 F5。

标签: c bitmap hex decimal offset


【解决方案1】:

给定的十六进制字节是从数据开始的字节偏移量

假设您给定的转储是 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')
  • 软件 Major.Minor 版本 = 0x01.0xF5 = 1.245 十进制
  • 硬件主要.次要版本 = 0xDE.0xD4 = 222.212
  • 国家/地区编号 = 0x50 = 80 十进制(也可以是 ASCII 'P')
  • 区号 = 0x81 = 129 十进制(也许 0x01 = 1 设置了第 7 位?)
  • 传感器编号 = 0x0002 = 2 位十进制数(假定为大端)

【讨论】:

  • 感谢您的出色回答。很抱歉让您有些困惑,可能是在您破译结果时。但是,它帮助了我,干杯!
  • 不客气!请在允许时回来标记。
猜你喜欢
  • 2012-03-04
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多