hex - 这个十六进制数据是否存在有意义的非十六进制数字确实存在的模式?
问题描述
我正在尝试对旧的传感器接口程序(Draeger Pac III)进行逆向工程。我在传感器屏幕上报告了有意义的值,并通过串行端口嗅探器识别了原始十六进制数据。现在我正在尝试找出编写一些代码以在 arduino 上以实数接收和传输数据的模式。
编辑和更新: 到目前为止,此链接到另一个更新得多的 Draeger 模块是唯一可用的链接,但无助于解释以下计数方案背后的含义。
我 100% 确定这些字节是感兴趣的字节。例如,这是来自读数的一个值的原始数据:01 02 01 05 b0 00 19 00 d2 01 02 01 1d b0 00 00 43 9d 80 00 00 3e cc cc cd 42 5c 00 00 01 01 01 01 02 00 00 04 02 01 01 05 80
。前 8 个字节是第 9 个位置带有校验和的命令。直到并包括第 21 个字节,每个值变化都没有变化,我只能假设这些对应于其他状态组件。3e cc cc cd
有些如何代表 0.40。42 5c 00 00
代表55(仍然不确定如何)。下一部分表示其他组件的开/关,并且可以独立于表示数字的两个 4 字节数据集进行更改。最后 2 个字节是校验和。
Real # Byte 1 Byte 2 Byte 3 Byte 4
0.00 0 0 0 0
0.01 3c 23 d7 0a
0.02 3c a3 d7 0a
0.03 3c f5 c2 8f
0.04 3d 23 d7 0a
0.05 3d 4c cc cd
0.06 3d 75 c2 8f
0.07 3d 8f 5c 29
0.08 3d a3 d7 0a
0.09 3d b8 51 ec
0.10 3d cc cc cd
0.20 3e 4c cc cd
0.30 3e 99 99 9a
0.40 3e cc cc cd
0.50 3f 0 0 0
0.99 3f 7d 70 a4
1.00 3f 80 0 0
1.01 3f 81 47 ae
2.00 40 0 0 0
3.00 40 40 0 0
4.00 40 80 0 0
4.10 40 83 33 33
4.11 40 83 85 1f
5.00 40 a0 0 0
8.14 41 2 3d 71
10.00 41 20 0 0
19.00 41 98 0 0
20.00 41 a0 0 0
21.00 41 a8 0 0
30.00 41 f0 0 0
31.00 41 f8 0 0
31.51 41 fc 14 7b
32.00 42 0 0 0
33.00 42 4 0 0
34.00 42 8 0 0
39.00 42 1c 0 0
40.00 42 20 0 0
41.00 42 24 0 0
65.00 42 82 0 0
70.00 42 8c 0 0
80.00 42 a0 0 0
95.00 42 be 0 0
100.00 42 c8 0 0
这些数据的模式是什么?
解决方案
答案在 IEEE-754 浮点转换器中。这让我得到了我想要的所有结果。
https://www.h-schmidt.net/FloatConverter/IEEE754.html
为了便于在 python3 中将十六进制转换为十进制:
import struct
input='3f 81 47 ae'
val=struct.unpack('!f', bytes.fromhex(input))[0]
print (round(val,2))
推荐阅读
- java - Bean 和 SQL 异常
- vb.net - 使用编辑按钮禁用所有文本框字段解锁的快速方法
- java - Java 2d 数组矩阵程序(素数之和)
- flutter - 已指定命名参数“body”的参数。当我们在颤振的脚手架中有两个“body”时我们应该做什么
- ios - 应用程序从挂起状态转换到后台状态后,Timer 对象是否继续触发?
- python - Django 模板 - 渲染具有特定属性的对象
- gcc - 如何在模块文件中设置 USIF 特定变量“GLIBC”?
- rest - 集成 Zoho REST API
- python - 如何确定我的操作系统上是否有 GPU 可用?
- selenium - 我们可以使用 webDriver 采样器了解 JMeter 中每个页面的浏览器渲染时间吗?