从二进制文件中提取文本(在Windows 7上使用Python 2.7)
我有一个大约5MB大小的二进制文件。。其中有很多穿插的文字。。和控制字符 这实际上相当于SITATEX应用程序的outlook.pst文件(来自SITA) 该文件包含从外部世界发送和接收的所有文本消息…(但文本必须通过二进制控制字符提取)。。所有的短信都清晰可见。。。以^M个字符结尾的行。。。等等 例如:假设^X是控制字符\xaa和HEX aa等。围绕我所需的文本提取加载它们从二进制文件中提取文本(在Windows 7上使用Python 2.7),python,perl,text-extraction,Python,Perl,Text Extraction,我有一个大约5MB大小的二进制文件。。其中有很多穿插的文字。。和控制字符 这实际上相当于SITATEX应用程序的outlook.pst文件(来自SITA) 该文件包含从外部世界发送和接收的所有文本消息…(但文本必须通过二进制控制字符提取)。。所有的短信都清晰可见。。。以^M个字符结尾的行。。。等等 例如:假设^X是控制字符\xaa和HEX aa等。围绕我所需的文本提取加载它们 ^@^@^@^@^@^@^@^@^@^@^@BLLBBCC^X^X^X^X^X^X^X^X^X ^X^X^X MVT^M
^@^@^@^@^@^@^@^@^@^@^@BLLBBCC^X^X^X^X^X^X^X^X^X
^X^X^X
MVT^M
EA1123 TEXT TEXT TEXT^M
END^M
\xaa^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@TTBBTT^X^X^X^X^X^X^X^X^X
^X^X^X blah blah blah... of control characters.. and then the message comes..
MVT MESSAGE 2
ED1123
etc.
等等。。有好几条消息
使用Perl。。这很容易做到:
while (<>) {
use regular expression to split messages
m/ /
}
到目前为止还不错。。我仍然没有完全做完。。因为我需要逐行逐字地解析文本。。要拾取(作为示例)源地址和标题、主题行、消息正文。。。通过控制字符解析消息
现在我被困在。。。如何使用转换为\x00\x02..
等的控制字符逐行打印(使用\xHH
格式)。。但不要使用普通的可读文本
例如。。假设我有:假设^@
和^X
是一些控制字符
line1='^@UG^^^^^^^^^^^^^ BLLBBCC^X^X^X^X^X^X^X^X^X'
(在第一行)
当我打印处于空闲状态的行时<代码>打印行1。。它只打印前2或3个字符。。并忽略其余部分,因为控制字符被阻塞
但是,当我打印时:print re.findall(r'.*',第1行)
它可以很好地打印,所有控制字符都转换为\xHH格式。。和ascii文本保持不变。。(正如我所希望的)…只抓一个。。这个列表有两项。。以“”结尾
re.findall(r'.*',第1行)
是唯一简单的解决方案。。要进行此转换。。或者有没有其他直接的方法。。将'\x00string'
转换为\xHH和文本(其中它是可打印字符或空白)
还有。。任何其他有用的注释都可以很好地表达出来
谢谢
更新2011年1月2日-第2部分
我发现re.findall(r'.+',第1行)
strips to
['\xaaUG\x02\x05\x00\x04\x00\x00\x00\x05\x00\x00\x00....
x00\x00\x00..BLLBBCC\x00\x00N\x00N\\x00
002 010 180000 DEC 11']
列表中没有额外的空白“”项。这一发现是经过多次尝试和错误后得出的
尽管如此,我仍然需要帮助来完全删除列表,但只返回一个字符串。
像这样:
'\xaaUG\x02\x05\x00\x04..BLLBBCC..002 010 180000 DEC 11'
增加了1月5日的信息:
@约翰·梅金
1) \xaaU是消息之间的分隔符。。在这个例子中。。我可能在样品中遗漏了。请参见下面的一条以\xaaU结尾的实际消息(但被忽略)。
以下文本来自repr(msg betweenr'\xaaU.*(?=\xaaU)
)
我正在努力理解二进制格式。。这是发出的典型信息
第一个“JJJOWXH”是发件人地址。。任何后面有7个字母数字的都是接收方地址。。基于发件人地址。。我可以知道这是“SND”还是“RCV”。。由于源代码是“JJJOWXH”。。。这个味精是“SND”,因为我们是“JJJOWXH”
该消息的地址是:JJKLXH。。。。JJKRXH。。。。等等
只要所有的\x00000000完成。。
sita标题和主题开始
在这种特殊情况下<代码>“\x00QN\x00HX\x00180001\x00”这是标题。。我只对\x00之间的所有内容感兴趣
接下来是尸体。。在最后\x00或任何其他控制字符之后。。。在这种情况下。。。它是:
COR\r\nMVT\r\nHX9136/17.BLNZ.JJJ\r\nA2309/2314 EA0128
BBB\r\nDRA/CI/0032/0022\r\nSI EET 02:14\r\n由于
迟交的ARVL ACFT\r\n CI/0022卸载悬垂托盘由于不足
打包导致\r\n空间问题
一旦可读文本结束。。。将忽略在结束\xaaU之前出现的第一个控制字符。。。在上述情况下。。“空间问题”。。这是最后一个。。然后控制字符开始。。。所以被忽略。。。有时控制字符直到下一个\xaaU才出现
这是一条完整的信息
"\X0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00:\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\x00\0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\\\\X0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\\\\\\\\\\\\\\\\\\\\\\0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\00\\\\\\\\\\\\\\\\\\x00\x00\x00\x00\x00\x00\x00\x00\x00\00\00\\\\\\00\\\\\00\\\\\\\\\\x00\xff\x8f\x01\x90\x01\x00\x01jjfcxh\x00\xff\x97\x01\x98\x01\x00\x01jjfash\x00\x00\x9f\x01\x10\x01\x01\x01\x01\x01\x00\x00\x01\x01\x01\x01\x00\x00\x00\x01\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x01\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x01\xd8\x01\x00\x01BBBFRUO\x00\x00\xdf\x01\xe0\x01\x00\x01BBBKKHX\x00\x00\xe7\x01\xe8\x01\x00\x01JJJLOTG\x00\x01\xef\x01\xf0\x01\x00\x01JJJLCTG\x00\x00\x00\xf7\x
['\xaaUG\x02\x05\x00\x04\x00\x00\x00\x05\x00\x00\x00....
x00\x00\x00..BLLBBCC\x00\x00N\x00N\\x00
002 010 180000 DEC 11']
'\xaaUG\x02\x05\x00\x04..BLLBBCC..002 010 180000 DEC 11'
fh = open('/path/to/my/file.ext', 'r')
fh.read()
fh = open('/path/to/my/file.ext', 'rb')
import re
mytext = '\xaaUseful text that I want to keep\xaa^X^X^X\xaaOther text i like\xaa'
usefultext = re.findall('\xaa([a-zA-Z^!-~0-9 ]+)\xaa', mytext)
print usefultext
fh = open('/some/file.ext','r')
for lines in fh.readlines():
#do stuff
import re
with open('yourfile.pst') as f:
contents = f.read()
textstrings = re.findall(r'[\x20-\x7E]+', contents)
>>> re.findall(r'.+', 'abc\r\ndef\r\n\r\n')
['abc\r', 'def\r', '\r']