首页 > 解决方案 > 如何解码这个十六进制 blob?

问题描述

我正在尝试解码这个 Firebird blob 以从中提取十进制数字(不确定它们将采用什么格式)。一些上下文是 blob 正在存储振动频谱数据,将振幅与频率绘制成图表。我很确定blob只包含幅度数据。这是我生成的小测试光谱的示例 blob 导出:

0000803F0000004000004040000080400000A0400000C0400000E0400000004100001041000020410000304100004041000050410000604100007041000080410000884100009041000098410000A0410000A8410000B0410000B8410000C0410000C8410000D0410000D8410000E0410000E8410000F0410000F84100000042000004420000084200000C4200001042000014420000184200001C4200002042000000006666663FA4707D3F77BE7F3F72F97F3F58FF7F3F0000803F0000C03F0000004000002040000040400000604000008040000088400000904000009840CDCC9C400000A0400000C84200007A4400401C46

据我所知,看起来每个数字都由 4 个字节的数据表示,在这个导出中是十六进制的。我知道它是每个值 4 个字节,因为它与下面的测试集对齐。我还认为前 2 个字节可能是小数部分,最后 2 个字节是整数?我认为它也可能使用比例因子。这是我的测试集(与上面相同,只是重新格式化),带有实际值(幅度):

Actual Value    Blob Section
1   0000803F
2   00000040
3   00004040
4   00008040
5   0000A040
6   0000C040
7   0000E040
8   00000041
9   00001041
10  00002041
11  00003041
12  00004041
13  00005041
14  00006041
15  00007041
16  00008041
17  00008841
18  00009041
19  00009841
20  0000A041
21  0000A841
22  0000B041
23  0000B841
24  0000C041
25  0000C841
26  0000D041
27  0000D841
28  0000E041
29  0000E841
30  0000F041
31  0000F841
32  00000042
33  00000442
34  00000842
35  00000C42
36  00001042
37  00001442
38  00001842
39  00001C42
40  00002042
0   00000000
0.9 6666663F
0.99    A4707D3F
0.999   77BE7F3F
0.9999  72F97F3F
0.99999 58FF7F3F
1   0000803F
1.5 0000C03F
2   00000040
2.5 00002040
3   00004040
3.5 00006040
4   00008040
4.25    00008840
4.5 00009040
4.75    00009840
4.9 CDCC9C40
5   0000A040
100 0000C842
1000    00007A44
10000   00401C46

很明显,它不仅仅是一个直接的十六进制 - 十进制转换,但我觉得这是专家能够识别的东西。任何有关如何将这 4 个字节的十六进制解码回数字值的帮助或指针将不胜感激!

标签: hexblobdecodefirebird

解决方案


这是行业标准的 4 字节浮点格式(单浮点)。

当然,字节顺序也应该考虑在内(您在上面的转储中看到它在视觉上颠倒了,与上面网站上正常写入十六进制整数相比)。


推荐阅读