解析十六进制文件以查找模式

时间:2015-07-06 15:17:28

标签: python parsing unicode hex

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

0x 00 00 00 <LENGTH> 00 00 

其中&lt;长度>是后面的条目的长度(以字节为单位)。因此,例如,一个带有此前缀的条目:

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

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

简而言之,我无法找出解析像这样结构的文件的最佳方法。普通文本文件我只是使用.split()以某种模式分割每个条目,但在这种情况下,每个&lt;长度>会有所不同,我不知道这是不是最好的方法。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

这可能是一个开始(如果你打开一个真实的文件;取消注释行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)