hex - 如何解码这个十六进制 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 个字节的十六进制解码回数字值的帮助或指针将不胜感激!
解决方案
这是行业标准的 4 字节浮点格式(单浮点)。
- https://www.h-schmidt.net/FloatConverter/IEEE754.html
- https://en.wikipedia.org/wiki/Single-precision_floating-point_format
当然,字节顺序也应该考虑在内(您在上面的转储中看到它在视觉上颠倒了,与上面网站上正常写入十六进制整数相比)。
推荐阅读
- python - aiohttp如何处理onclick函数
- c# - C#等待操作符的理解
- ruby - 为什么从红宝石中的浮点数(以毫秒精度)转换为时间会导致红宝石中的精度损失不一致?
- javascript - 如何在成功响应不为空之前调用相同的ajax
- ios - 调整视图的大小使其他视图在 UITableViewCell 中反弹
- json - 如何使用 Codable 在 Swift 中使用动态文件名解析 JSON
- android - 支持的最低 Android 版本 Cordova 9
- version - 在哪里找到 Azure DevOps Server 的数字版本号(安装前)?
- python - 在 gitlab ci 管道中,如何使用 python 连接到 redis 服务?
- r - 我怎样才能用尽函数的所有参数组合并将它们的结果收集在一个整洁的表中?