-2

我的任务是使用 Python 3 编写程序。我是 Python 新手。

我需要从 .bin 文件中获取十六进制数据,然后在每次看到特定十六进制模式的出现时对数据进行分区(例如:每个块以 01 03 开头)。最后,我需要输出每个块的分区数和大小(以字节为单位)。

到目前为止,我已经从 .bin 文件中读取了数据,并使用 re.findall 对每个数据块进行了分区。我的正则表达式语句看起来像这样:

b"\x01\x03(?(?!\x01\x03).)*"

re.findall 运行良好,但我现在有一个大约 300 个十六进制块的列表(因为我使用了 re.findall),我现在不知道如何检查每个块的大小(以字节为单位)。有人可以帮我弄这个吗?

4

2 回答 2

0

我建议

l = re.compile("\x01\x03(?(?!\x01\x03).)*").split(s)
len(l) - 1 

测试结果:

>>> re.compile(r"\x01\x03").split(b"\x01\x03\0x4\0x5\x01\x03\0x6\0x7")
['', '\x00x4\x00x5', '\x00x6\x00x7']

当然,您应该确保正则表达式是正确的。

于 2019-02-27T03:40:33.343 回答
0

您可以使用enumerate

regex = b'\x01\x03(?(?!\x01\x03).)*'

chunk_lengths = {index: len(chunk) for index, chunk in enumerate(re.findall(regex, data))}

您最初用于re.findall获取源数据中遵循给定正则表达式的每个块。这些是bytes对象,具有明确定义的长度(其中的字节数)。

使用len运算符,我们可以找到每个块的长度,这些将形成我们字典的值。如果我们这样做了[len(chunk) for chunk in re.findall(regex, data))],那将给我们一个找到的所有块的长度列表,按照它们被发现的顺序(这在后面很重要)。

enumerate是一个内置函数,允许将索引(默认从 0 开始)“标记”到某个可迭代对象。所以,假设你有一个list [5, 3, 4], 代表块的长度。如果你申请enumerate它,你会得到tuples (0, 5)(index 0, length 5), (1, 3)(index 1, length 3) 和(2, 4)(index 2, length 4)。

现在,通过将所有内容放在一个dict理解中,我们变得更能够通过创建的索引访问块的长度enumerate。由于如上所述,findall按顺序返回结果列表,并且 enumerate 也按顺序操作,因此创建的索引enumerate也是该块在原始数据中的相对位置。

于 2019-02-27T03:49:52.560 回答