0

我有一个二进制文件,我正在尝试从中提取字符串,并且我有很多时间这样做。:(

我目前的策略是使用 Python 读取文件(使用以下函数之一:read()、readline() 或 readlines())。接下来,我解析该行(逐个字符)并查找特殊字符“ô”,在大多数情况下,它直接跟随我想要的字符串!最后,我从记录所有我识别为“有效”的字符的特殊字符中向后解析。

在一天结束时,我想要前面的时间戳和行内的下 3 个字符串。

结果:

在输入示例第 1 行中,“读取”函数不会读取整行(显示在输出图像中)。我相信这是因为该函数将二进制文件解释为 EOF 字符,然后停止读取。

在示例的第 2 行中,有时会出现“特殊字符”,但它不在我要提取的字符串之后。:(

有没有更好的方法来解析这些数据?如果没有,有没有办法解决示例行#1中看到的问题?

当我将行打印为已读时输入数据和结果输出数据的示例。如您所见,使用时它不会读取整行readlines() 当我将行打印为已读时输入数据和结果输出数据的示例。 如您所见,使用 readlines() 时它不会读取整行

我的字符串提取算法,不是很健壮。 我的字符串提取算法,不是很健壮。

仅供参考,效率不一定是重要的。

4

2 回答 2

0

如果数据是二进制的,请不要将其读取为文本。将其作为二进制数据读取,然后尝试查找嵌入在二进制数据中的字符串。

with open("example.tp", "b") as f:
    data = f.read() # produces a bytes object in python 3

现在根据终端字符拆分数据

parts = data.split(b'\xf4') # f4 is hex code for your o character in latin-1

现在尽可能从每个部分中提取字符串:

from string import ascii_letters, digits

special_chars = '-()&, '
desired_chars = bytes(ascii_letters + digits + special_chars, encoding="ascii")

data = b'0,123\xf4NOPE#Hello world\xf4ignored' # sample data

parts = data.split(b'\xf4')

strings = []
for p in parts[:-1]: # ignore last part as it is never followed by the split char
    reversed_bytes = p[::-1]
    # extract the string
    for i, byte in enumerate(reversed_bytes):
        if byte not in desired_chars:
            chunk = reversed_bytes[:i]
            break
    else:
        chunk = reversed_bytes # all chars were valid
    bytes_ = chunk[::-1]
    bytes_ = bytes_.replace(b',', b'')
    strings.append(bytes_.decode("ascii")) # turn into a str
    # use ascii codec as there should be no non-ascii bytes in your string

print(strings) # prints ['0123', 'Hello world']
于 2016-05-03T19:35:17.330 回答
0

为什么使用 Python。使用字符串并将其通过头部管道,例如

    strings /bin/ls | head -3

看看你得到了什么。您也可以获得适用于 Windows 的字符串。

于 2016-05-03T18:20:07.930 回答