【问题标题】:How do I find the size of a hex string in bytes using Python3 (with regex)如何使用 Python3(使用正则表达式)找到以字节为单位的十六进制字符串的大小
【发布时间】:2019-07-20 17:05:36
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python regex hex byte python-3.7


    【解决方案1】:

    你可以使用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)(索引0,长度5),(1, 3)(索引1,长度3)和(2, 4)(索引2,长度4)。

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

    【讨论】:

    • 谢谢!你能解释一下这条线的作用吗?此外,我可以直观地计算每个帧的大小,因为每个十六进制数字都是半字节。这实际上是在计算块的大小(以字节为单位)(对于每个块),还是只是在块中找到十六进制值的数量?
    • 仅供参考,这段代码非常适合我。我看到 chunk_lengths 现在是一本字典,之后我能够继续解决其他问题。谢谢!
    • @codingbeginner123 不客气!如果它解决了您的问题,请接受我的回答。我将编辑答案以包含解释。
    • 完成!谢谢
    【解决方案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']
    

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

    【讨论】:

    • 谢谢!正则表达式似乎是正确的。我使用 regex101 对其进行了测试,并相应地拆分了块。我会试试这个。谢谢!
    • 问题:'split(s)' 中的 s 是否只代表正在测试的字符串?
    • 测试结果:``` >>> re.compile(r"\x01\x03").split(b"\x01\x03\0x4\0x5\x01\x03\0x6\0x7 ") ['', '\x00x4\x00x5', '\x00x6\x00x7'] ``
    猜你喜欢
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    相关资源
    最近更新 更多