【问题标题】:python: regular expression search pattern for binary files (half a byte)python:二进制文件的正则表达式搜索模式(半字节)
【发布时间】:2013-12-19 03:04:31
【问题描述】:

我正在使用以下正则表达式模式在二进制文件中搜索 0xDEAD4FAD:

my_pattern = re.compile(b"\xDE\xAD\x4F\xAD")

但是如何概括搜索 0xDEAD4xxx 的搜索模式?好像不能切过半个字节

【问题讨论】:

  • 当您第一次搜索的字节之一是正则表达式元字符时,您会感到头疼。

标签: python regex binaryfiles


【解决方案1】:

正则表达式确实允许搜索范围。因此,要找到第一个半字节为“4”的字节,请使用:

pattern = re.compile(b"[\x40-\x4F]")

以下测试表明它产生了所需的输出:

>>> for byte in ('\x3f', '\x40', '\x42', '\x4f', '\x50'): print bool(pattern.search(byte))
... 
False
True
True
True
False

要回答有关搜索 0xDEAD4xxx 的具体问题,请使用:

my_pattern = re.compile(b"\xDE\xAD[\x40-\x4F].")

【讨论】:

  • 嘿,如果我希望搜索结果将最后 3 个十六进制字符作为单独的组返回我该怎么办?我如何在你制作的那个东西之间插入 ()?
  • 不幸的是,AFAIK,只按字节分组,而不是按半字节分组。
  • 嘿,还不错。 Python 提供按位运算。因此,您可以取出一个字节并将上半字节或下半字节清零,然后处理剩下的部分。
  • 如果你有一些字节,比如byte=b'\x3c',那么作为整数,低半字节是ord(byte) & ord(b'\x0f'),高半字节是(ord(byte) & ord(b'\xf0')) / 16
  • 我用:my_pattern = re.compile(b"\xDE\xAD([\x40-\x4F][\x00-\xFF])") 得到两组然后:my_integer = int (binascii.hexlify(sr.group(1)[-3:],16);
【解决方案2】:

我怀疑最好将二进制字符串转换为 ASCII 十六进制字符串,然后将正则表达式应用于该字符串。我不相信正则表达式旨在处理二进制数据。你也许可以让它发挥作用,但如果一路上有惊喜,请不要感到惊讶。

【讨论】:

    【解决方案3】:

    如果我遇到你的情况,我会尝试使用 grep 进行 hexdump。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      相关资源
      最近更新 更多