如何在python中搜索一定数量的十六进制和非十六进制数据

2024-10-01 13:32:42 发布

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

我有一根像这样的绳子

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

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

^{2}$

它会输出这个

'\x00\x0e12102 G1103543'

我遇到的问题是\x10\x54并不总是在我想要的数据的末尾。然而,我注意到前两个十六进制数字对应于数据长度的长度。一、 E.\x00\x0e=14,因此数据长度为14char。在

有没有更好的方法可以做到这一点,比如匹配第一部分,然后剪切下一个14个字符?我还应该说,长度将随着我寻找匹配的几个东西。在

另外,有没有一种方法可以以全十六进制输出字符串,这样在pythonshell中工作时更容易阅读,即\x10B==\x10\x42

谢谢你!在

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

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

Tags: 数据方法x10x00x03绳子x07newdata
1条回答
网友
1楼 · 发布于 2024-10-01 13:32:42

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

首先,你所说的“十六进制数据”不是“十六进制数据”—它只是字节 在ASCII范围之外的流中,Python2将这些字符显示为\x10等等,但在内部它只是一个值为16的字节(当被视为十进制时)。您编写的\x42对应于ASCII字母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

相关问题 更多 >