首页 > 解决方案 > 这个十六进制数据是否存在有意义的非十六进制数字确实存在的模式?

问题描述

我正在尝试对旧的传感器接口程序(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

这些数据的模式是什么?

标签: hexseriesbinary-data

解决方案


答案在 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))

推荐阅读