【问题标题】:How do I search for a set amount of hex and non hex data in python如何在 python 中搜索一定数量的十六进制和非十六进制数据
【发布时间】:2015-09-13 23:46:44
【问题描述】:

我有一个看起来像这样的字符串

'\x00\x03\x10B\x00\x0e12102 G1103543\x10T\x07\x21'

我已经能够将我想要的数据“12102 G1103543”与这个匹配。

re.findall('\x10\x42(.*)\x10\x54', data)

哪个会输出这个

'\x00\x0e12102 G1103543'

我遇到的问题是 \x10\x54 并不总是在我想要的数据的末尾。但是我注意到的是,前两个十六进制数字对应于数据长度的长度。 IE。 \x00\x0e = 14 所以数据长度为 14char 长。

有没有更好的方法来做到这一点,比如匹配第一部分然后删除接下来的 14 个字符?我还应该说,长度会随着我想要匹配几件事而有所不同。

还有一种方法可以以所有十六进制输出字符串,这样我在 python shell IE 中工作时更容易阅读。 \x10B == \x10\x42

谢谢!

编辑:我设法想出了这个可行的解决方案。

newdata = re.findall('\x10\x42(.*)', data)
newdata[0][2:int(newdata[0][0:2].encode('hex'))]

【问题讨论】:

  • 如果您可以安全地确定存储长度的位置,您应该从那里删除下一个数字
  • 应该知道我需要更加努力。
  • 将此作为一个过程执行,而不是从上方查看整个文件。您的循环应该是:1. 读取 2 个字节,2. 将它们解释为以下消息的长度,3. 读取那么多字节,4. 转到 1

标签: python regex hex


【解决方案1】:

请注意,您手头有一个结构化的二进制文件,尝试使用正则表达式从中提取数据是愚蠢的。

首先你所说的“十六进制数据”不是“十六进制数据”——它只是字节 在 ASCII 范围之外的流中 - 因此 Python2 会将这些字符显示为 \x10 等等 - 但在内部它只是一个值为 16 的单个字节(当视为十进制时)。 \x42you 写入对应于 ASCII 字母 B,这就是为什么您在表示中看到 B

因此,最好的办法是获取文件规范,并使用struct 模块和字节串切片从那里读取您想要的数据。

如果您没有文件规范,那么找出感兴趣的领域是一项逆向工程工作 - 就像您已经在做的那样。但即便如此,您也应该使用 struct 模块编写一些代码来获取您的值,因为字段长度(以及最可能的偏移量)是在字节流本身中编码的。

在此示例中,您的标记“\x10\x42”本身很少是标记 - 它的位置很可能由文件中的其他因素(文件定义中的固定位置或文件中较早的偏移量。

但是 - 如果你正确地使用它作为标记,你可以使用正则表达式来找出 "\x10\x42" 标记的所有偏移量,并且它们将以下两个字节解释为消息长度:

import struct, re

def get_data(data, sep=b"\x10B"):
    results = []
    for match in re.finditer(sep, data):
        offset = match.start()
        msglen = struct.unpack(">H", data[offset + 2: offset + 4])[0]
        print(msglen)
        results.append(data[offset + 4: offset + 4 + msglen])
    return results

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2014-02-18
    • 1970-01-01
    • 2022-12-12
    • 2022-11-16
    • 1970-01-01
    • 2023-02-15
    • 2011-06-01
    相关资源
    最近更新 更多