根据csv文件解析二进制文件

时间:2021-07-13 21:38:29

标签: python-3.x parsing struct binaryfiles

我想用来自 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 年了。

1 个答案:

答案 0 :(得分:1)

<块引用>

一个数据块的大小为 2068 字节

您拥有的是一个 2068 字节记录的二进制文件,以及一个描述记录布局的文本文件(您称之为“CSV”)。

我首先将记录布局解析为一个包含 725 个字段描述符的元组。每个描述符都是一个长度、助记符和(为了更好的衡量)类型的元组。每个数据记录都可以在内存中用字典表示(由助记符键控)。

然后,遍历输入,一次读取一个 2068 字节的记录。对于每条记录,做……处理每条记录的事情。

我没有使用过,但我会尝试使用 Python 标准库中的 struct module。我想这就是你想要的。您可能需要 eval 一些 Python 来应用来自记录描述符元组的数据,它可能不会非常快,但看起来它会让您到达那里。

否则,遍历记录描述符,将 length 字节复制为整数,并将该整数分配给字典。您可能会发现编写一个处理单个字段(填充一个字典元素)的函数并将该函数传递给 Python 的标准 map 很方便。

您对每条记录(每本词典)的处理方式显然取决于您。