【发布时间】:2021-07-13 21:38:29
【问题描述】:
我想用 csv 文件中的方案解析二进制文件。
csv:
Hex Addr Byte Package ... Tlm Type Tlm Conversion (EU/lsb) Eng. Units (EU)
0 0x420 32.0 COMMAND_TLM ... uint8 1.0 0/OK 1/BAD_APID 2/BAD_OPCODE 3/BAD_DATA 7/NO_C...
1 0x421 33.0 COMMAND_TLM ... uint8 1.0 0/OK 1/BAD_APID 2/BAD_OPCODE 3/BAD_DATA 7/NO_C...
2 0x422 34.0 COMMAND_TLM ... uint8 1.0 none
3 0x423 35.0 COMMAND_TLM ... uint8 1.0 none
4 0x424 36.0 COMMAND_TLM ... uint8 1.0 none
.. ... ... ... ... ... ... ...
721 0x9c9 1481.0 EXT_TRACKER2 ... uint16 1.0 none
722 0x9cb 1483.0 EXT_TRACKER2 ... uint8 1.0 0/NEW_DATA_IN 1/COMMITTING 2/COMMITTED 3/EXTRA...
723 0x9cc 1484.0 EXT_TRACKER2 ... uint8 1.0 none
724 0x9cd 1485.0 EXT_TRACKER2 ... uint8 1.0 none
725 0x9ce 1486.0 EXT_TRACKER2 ... uint8 1.0 none
来自 csv 的列:
Index(['Hex Addr', 'Byte', 'Package', 'Mnemonic', 'Short Description',
'Tlm Type', 'Tlm Conversion (EU/lsb)', 'Eng. Units (EU)'],
dtype='object')
附加信息:
- 二进制文件中的时间信息从 2000 年 1 月 1 日 00:00:00 开始以 TAI 秒为单位
- ECI 参考系为 J2000
- 一个数据块的大小是2068字节
到目前为止,我阅读了该文件,并对接下来的步骤感到震惊:
n [61]: def read_data():
...: with open('telemetry.bin','rb') as file:
...: data = file.read()
...: return data
...:
...:
In [62]: len(data)
Out[62]: 7510976
我正在考虑使用 csv 文件中的字段创建一个结构类,并使用新创建的结构对象中的模式迭代二进制文件。但我认为我的方法缺少一些东西。特别是我不应该将 csv 中的哪些列编码到 struct 对象中。
我也在努力解决问题 - 第一个数据块是否等于 data[:2068]
如果您有关于此主题的任何资源,我将不胜感激。我知道有很多问题,但我非常渴望最终完成这项任务——我收到它已经快 4 年了。
【问题讨论】:
-
有点不清楚您在这里尝试做什么,因为您提供的示例既不是二进制也不是 csv - 它似乎是一种柱状文本格式。请澄清一下,您是在解析给定的二进制文件,试图从上述输出中生成二进制文件,还是其他什么?
-
试图解析我收到的二进制文件
-
我正在考虑一些类似的事情,因为我发现这个关于 Ruby 的 SO 问题:stackoverflow.com/questions/46428471/…
-
可能会显示前几条记录的转储,显示为十六进制。
-
?这怎么能包含记录似乎在上面的 8-9 列数据? FWIW,在我看来更像是二进制代码摘录,最后是 0xC3(ret),等等。
标签: python-3.x parsing struct binaryfiles