Skip to main content
 首页 » 编程设计

Python 正则表达式从二进制文件中提取数据 block

2024年08月27日28softidea

我有一个二进制文件。我需要使用 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 个空字节,那么它应该只将这些空字符设置为分隔符。否则它应该将这些空字节包含到非空字符中。正如您在给定示例中所见,提取的字符集中也存在一些空字符。

如果它没有任何意义,请告诉我,我会尝试以更好的方式解释它。

提前致谢

请您参考如下方法:

你可以在 \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"; 
 
} 

输出>>

<ff,fe,fe,0,0,23,41,> 
<41,49,57,0,0,0,0,32,41,49,57,0,0,0,0,32,> 
<56,65,0,35,56,>