如何使用 Python3 (使用正则表达式)找到以字节为单位的十六进制字符串的大小

How do I find the size of a hex string in bytes using Python3 (with regex)

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

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

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

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

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

我建议

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

测试结果:

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

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

您可以使用 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 是一个内置函数,允许 "tagging on" 索引(默认从 0 开始)到某个可迭代对象。因此,假设您有一个 list [5, 3, 4],表示块长度。如果你对它应用 enumerate,你会得到 tuples (0, 5)(索引 0,长度 5),(1, 3)(索引 1,长度 3)和 (2, 4)(索引 2,长度 4)。

现在,通过将所有内容放在一个 dict 推导式中,我们变得更能够通过 enumerate 创建的索引访问块的长度。因为,如上所述,findall returns 的结果列表是按顺序排列的,而 enumerate 也是按顺序操作的,所以 enumerate 创建的索引也是 chunk 在原始数据中的相对位置。