从十六进制解压十进制 - 通过位偏移
Unpack Dec from Hex - via bit offsets
我有一个包含传感器设置的十六进制数据块,我将包含十六进制的开始片段(LSB 在前):
F501517C 8150D4DE 04010200 70010101
05F32A04 F4467000 00000AFF 0502D402
这直接来自将此十六进制解码为 dec 的文档:
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
这是我唯一需要解码的信息。偏移列必须是理解这一点的技巧。
- 十六进制值偏移量是多少?
- 我在第一个十六进制字符串中看到 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')
- 软件Major.Minor版本=0x01.0xF5=十进制1.245
- 硬件Major.Minor版本=0xDE.0xD4=222.212
- 国家编号 = 0x50 = 80 十进制(也可以是 ASCII 'P')
- 区号 = 0x81 = 129 十进制(也许 0x01 = 1 并设置了第 7 位?)
- 传感器编号 = 0x0002 = 2 位十进制(假定为大端)
我有一个包含传感器设置的十六进制数据块,我将包含十六进制的开始片段(LSB 在前):
F501517C 8150D4DE 04010200 70010101 05F32A04 F4467000 00000AFF 0502D402
这直接来自将此十六进制解码为 dec 的文档:
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
这是我唯一需要解码的信息。偏移列必须是理解这一点的技巧。
- 十六进制值偏移量是多少?
- 我在第一个十六进制字符串中看到 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')
- 软件Major.Minor版本=0x01.0xF5=十进制1.245
- 硬件Major.Minor版本=0xDE.0xD4=222.212
- 国家编号 = 0x50 = 80 十进制(也可以是 ASCII 'P')
- 区号 = 0x81 = 129 十进制(也许 0x01 = 1 并设置了第 7 位?)
- 传感器编号 = 0x0002 = 2 位十进制(假定为大端)