我想用来自 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')
附加信息:
到目前为止,我阅读了该文件,并对接下来的步骤感到震惊:
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 年了。
答案 0 :(得分:1)
一个数据块的大小为 2068 字节
您拥有的是一个 2068 字节记录的二进制文件,以及一个描述记录布局的文本文件(您称之为“CSV”)。
我首先将记录布局解析为一个包含 725 个字段描述符的元组。每个描述符都是一个长度、助记符和(为了更好的衡量)类型的元组。每个数据记录都可以在内存中用字典表示(由助记符键控)。
然后,遍历输入,一次读取一个 2068 字节的记录。对于每条记录,做……处理每条记录的事情。
我没有使用过,但我会尝试使用 Python 标准库中的 struct module。我想这就是你想要的。您可能需要 eval
一些 Python 来应用来自记录描述符元组的数据,它可能不会非常快,但看起来它会让您到达那里。
否则,遍历记录描述符,将 length
字节复制为整数,并将该整数分配给字典。您可能会发现编写一个处理单个字段(填充一个字典元素)的函数并将该函数传递给 Python 的标准 map
很方便。
您对每条记录(每本词典)的处理方式显然取决于您。