我有一根像这样的绳子
'\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'))]
请注意,您手头有一个结构化的二进制文件,尝试使用正则表达式从中提取数据是愚蠢的。在
首先,你所说的“十六进制数据”不是“十六进制数据”—它只是字节 在ASCII范围之外的流中,Python2将这些字符显示为}。在
\x10
等等,但在内部它只是一个值为16的字节(当被视为十进制时)。您编写的\x42
对应于ASCII字母B
,这就是为什么您在表示中看到{因此,最好的办法是获取文件规范,然后使用
struct
模块和字节字符串切片从中读取所需的数据。在如果你不能得到文件规范,那么这是一个逆向工程工作,找出感兴趣的领域-就像你已经在做的一样。但即使这样,您也应该使用struct模块编写一些代码来获取值,因为字段长度(以及最有可能的偏移量)是在字节流本身中编码的。在
在本例中,标记“\x10\x42”本身很少是标记-它的位置很可能是由文件中的其他因素(文件定义中的固定位置或文件中较早的偏移量)指示的。在
但是-如果您正确地将其用作标记,则可以使用正则表达式来查找“\x10\x42”标记的所有偏移量,并将以下两个字节解释为消息长度:
相关问题 更多 >
编程相关推荐