【问题标题】:Parsing Hexadecimal file looking for patterns解析十六进制文件以查找模式
【发布时间】:2015-07-06 15:17:27
【问题描述】:

我正在解析一个 unicode/十六进制文件,该文件基本上包含一系列我感兴趣的“条目”。在这些条目之前将是以下模式:

0x 00 00 00 <LENGTH> 00 00 

其中 是后面条目的长度(以字节为单位)。因此,例如,前面带有 this 的条目:

0x 00 00 00 48 00 00 ..........

接下来的 72 个字节(0x48 转换为十进制)将是我关心的 unicode 条目。

简单地说,我想不出解析这种结构的文件的最佳方法。普通文本文件我只会使用 .split() 以特定模式拆分每个条目,但在这种情况下,每个 都会不同,我不知道这是否是最好的方法。

我正在考虑使用一个函数,该函数采用十六进制输入(整个文件)、开始位置和结束位置,在遍历并获取每个条目的偏移量后获取每个条目,尽管我觉得可能有一个更有效的方式来做到这一点。

我想在我开始破解它之前我会得到一些输入。有什么想法吗?

编辑:有关文件结构的更多信息。它是大端的,我正在寻找的模式实际上是这个,尽管由于某种原因,只有第一个条目不遵循这种模式(特殊情况,我可以稍后处理):

0x 00 00 00 48 00 00 ......... 

其中 0x 48 是以下条目的大小。所以有两个字节的填充,然后是两个字节的大小,然后是两个字节的填充,然后是条目。正如我所说,由于某种原因,第一个条目没有相同的填充,但我可以稍后处理。每个其他条目在大小之前/之后都有相同的填充。

【问题讨论】:

  • 嗯。 00 00 00 .... 看起来不像是 Unicode。您需要知道有多少 字节 代表每个 Unicode 字符(通常为 2 个,但最多可能为 4 个)以及它们以何种字节顺序出现。
  • 你是对的。我编辑了更多信息。它是大端的,上面对大小之前/之后的填充进行了更好的描述。谢谢!
  • 不清楚文件中的实际内容是什么。更新您的问题并包括print(repr(open('your_file', 'rb').read(2+2+0x48))) 是什么?

标签: python parsing unicode hex


【解决方案1】:

这可能是一个开始(如果您要打开一个真实文件;取消注释 with open... 行;rb 模式在那里至关重要;您想以二进制模式打开文件)

import io

# with open('filename.data', 'rb') as fle:
fle = io.StringIO('\x00\x00\x00\x48\x00\x01\x02')

# read the first 3 0x00
for _ in range(3):
    fle.read(1)
# read the length
length = ord(fle.read(1))
print(length)
data = fle.read(length)

【讨论】:

  • OP 没有在任何地方提到“二进制”。这也显示在他的示例行中 - 0x 没有出现在二进制文件中。
  • 哦,我认为这是...嗯...文件中的二进制字符的简写。但也许我错了。
猜你喜欢
  • 2022-11-16
  • 2010-12-30
  • 1970-01-01
  • 2013-08-12
  • 2018-09-27
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多