Python正则表达式从二进制Fi中提取数据块

2024-05-14 21:31:59 发布

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

我有一个二进制文件。从这个文件中,我需要使用python正则表达式提取一些数据块。

我需要提取空字符集之间的非空字符集。

例如,这是主要字符集:

\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\xfe\x00\x00\x23\x41\x00\x00\x00\x00\x00\x00\x00\x00\x41\x49\x57\x00\x00\x00\x00\x32\x41\x49\x57\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x65\x00\x35\x56

正则表达式应从上面的主集中提取以下字符集:

\xff\xfe\xfe\x00\x00\x23\x41, \x41\x49\x57\x00\x00\x00\x00\x32\x41\x49\x57\x00\x00\x00\x00\x32 and \x56\x65\x00\x35\x56

有一点很重要,如果它连续获得5个以上的空字节,那么只有它才应该将这些空字符集作为分隔符来处理。否则,它应该将这个空字节包含到no null字符中。正如您在给定的示例中看到的,在提取的字符集中也存在一些空字符。

如果没有任何意义,请让我知道,我会尽量解释的更好的方式。

提前谢谢你


Tags: 文件字节二进制x00字符集xffxfex65
3条回答

可以将split和lstrip与list comprehension一起使用,如下所示:

s='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\xfe\x00\x00\x23\x41\x00\x00\x00\x00\x00\x00\x00\x00\x41\x49\x57\x00\x00\x00\x00\x32\x41\x49\x57\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x65\x00\x35\x56'
sp=s.split('\x00\x00\x00\x00\x00')
print [i.lstrip('\x00\\')  for i in sp if i != ""]

输出:

^{pr2}$
  1. 基于5个nul值拆分整个数据。在
  2. 在列表中,查找是否有任何元素以nul开头,如果是以nul开头,则删除它们(这适用于在开始时替换nul的可变数量)。在

下面是如何用Python实现它。我必须str.strip()关闭并使用前导和尾随的null来获得regex模式,以防止在re.split()返回的结果列表的开头包含额外的空字符串。在

import re

data = ('\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\xfe\x00\x00\x23\x41'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x41\x49\x57\x00\x00\x00\x00\x32\x41'
        '\x49\x57\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x56\x65\x00\x35\x56'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

chunks = re.split(r'\000{6,}', data.strip('\x00'))

# display results
print ',\n'.join(''.join('\\x'+ch.encode('hex_codec') for ch in chunk) 
                         for chunk in chunks),

输出:

^{pr2}$

您可以在\x00{5,}
这是5个或更多的零。这是你指定的分离机。在

在Perl中,它是这样的

Perl测试用例

$strLangs =  "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\xfe\x00\x00\x23\x41\x00\x00\x00\x00\x00\x00\x00\x00\x41\x49\x57\x00\x00\x00\x00\x32\x41\x49\x57\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x56\x65\x00\x35\x56";

# Remove leading zero's (5 or more)
$strLangs =~ s/^\x00{5,}//;

# Split on 5 or more 0's
@Alllangs = split /\x00{5,}/, $strLangs;

# Print each language characters
foreach $lang (@Alllangs)
{
    print "<";
    for ( split //, $lang ) {
       printf( "%x,", ord($_)); 
    }
    print ">\n";

}

输出>>

^{pr2}$

相关问题 更多 >

    热门问题