繁体   English   中英

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

[英]Python Regular Expression Extract Chunk of Data From Binary File

我有一个二进制文件。 从该文件中,我需要使用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 \\ x00 \\ x32和\\ x56 \\ X65 \\ X00 \\ X35 \\ X56

重要的是,如果连续获得5个以上的空字节,则仅应将这些空字符设置为分隔符。否则,应将此空字节包括在非空字符中。 在给定的示例中您可以看到,提取的字符集中也几乎没有空字符。

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

提前致谢,

您可以将split和lstrip用于列表推导,如下所示:

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 != ""]

输出:

['\xff\xfe\xfe\x00\x00#A', 'AIW\x00\x00\x00\x002AIW\x00\x00\x00\x002', 'Ve\x005V']
  1. 根据5个nul值分割整个数据。
  2. 在列表中,查找是否有任何以nul开头的元素,以及是否已将其删除(这适用于开始时可变数量的nul替换)。

您可以分割为\\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,>

这是在Python中进行操作的方法。 我必须关闭str.strip()并在前导和尾随null处获取正则表达式模式,以防止在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),

输出:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM