如何使用 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
,你会得到 tuple
s (0, 5)
(索引 0,长度 5),(1, 3)
(索引 1,长度 3)和 (2, 4)
(索引 2,长度 4)。
现在,通过将所有内容放在一个 dict
推导式中,我们变得更能够通过 enumerate
创建的索引访问块的长度。因为,如上所述,findall
returns 的结果列表是按顺序排列的,而 enumerate 也是按顺序操作的,所以 enumerate
创建的索引也是 chunk 在原始数据中的相对位置。
我的任务是使用 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
,你会得到 tuple
s (0, 5)
(索引 0,长度 5),(1, 3)
(索引 1,长度 3)和 (2, 4)
(索引 2,长度 4)。
现在,通过将所有内容放在一个 dict
推导式中,我们变得更能够通过 enumerate
创建的索引访问块的长度。因为,如上所述,findall
returns 的结果列表是按顺序排列的,而 enumerate 也是按顺序操作的,所以 enumerate
创建的索引也是 chunk 在原始数据中的相对位置。