如何使用Python3(带regex)查找以字节为单位的十六进制字符串的大小

2024-04-26 01:37:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我的任务是用python3编写一个程序。我对Python还不熟悉。你知道吗

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

到目前为止,我已经从.bin文件中读取数据并使用关于芬德尔对每个数据块进行分区。我的正则表达式语句如下所示:

b“\x01\x03(?)?(?!\x01\x03)。)*“

你知道吗关于芬德尔工作得很好,但是我现在有一个大约300个十六进制块的列表(自从我使用关于芬德尔),我现在不知道如何检查每个块的字节大小。有人能帮我吗?你知道吗


Tags: 文件数据程序列表数量字节bin模式
2条回答

我建议

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']

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

您可以使用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是一个内置函数,允许对某个iterable对象的索引(默认从0开始)进行“标记”。所以,假设您有一个list[5, 3, 4],表示块长度。如果对其应用enumerate,则会得到tuples(0, 5)(索引0,长度5)、(1, 3)(索引1,长度3)和(2, 4)(索引2,长度4)。你知道吗

现在,通过将所有内容放在dict理解中,我们可以通过enumerate创建的索引来访问块的长度。如上所述,findall按顺序返回结果列表,枚举也按顺序操作,因此enumerate创建的索引也是块在原始数据中的相对位置。你知道吗

相关问题 更多 >

    热门问题