【问题标题】:count occurrences in binary file Python 2X计算二进制文件 Python 2X 中的出现次数
【发布时间】:2015-04-11 13:19:41
【问题描述】:

我想用 Python 2.7.3 计算二进制文件中特定标题部分的出现次数。我发现了很多例子来计算 .txt 类型文件中的出现次数以及与行有关的信息,但很少有关于计算二进制文件中字节序列的信息。

您可能会使用二进制文件中的 ASCII 字符来使用字符串进行搜索。

十六进制的标题部分是"28 00 28 00 28 00""( ( ( " in ascii。

我认为代码应该是这样的:

total = 0
for line in f:
    if "( ( ( " in line:
        total += 1
f.close()
print "%s" % total 

但它似乎甚至不计算一次,它会打印一行,长度为 120 个字符。

【问题讨论】:

    标签: python python-2.7 count binary


    【解决方案1】:

    你有 NULL 个字节,而不是空格。通过使用'( ( ( ' 正在寻找28 20 28 20 28 20,而不是28 00 28 00 28 00

    使用\x00 创建这样的字节:

    if "(\x00(\x00(\x00" in line:
    

    中循环一个二进制文件可能没有意义;这只有在该文件中确实有 \n 字节时才有效。

    您可以按块而不是行来搜索文件:

    previous = ''
    total = 0
    for chunk in iter(lambda: f.read(2048), ''):
        if "(\x00(\x00(\x00" in previous + chunk:
            total += 1
        previous = chunk[-5:]  # ensure we don't miss matches at boundaries
    

    【讨论】:

    • 谢谢你,菜鸟的错误,更新后的 IF 语句总计数仍然为 0。字节会比在 FOR 语句中使用“行”更好吗?
    • @Python_newbie:那么你 100% 确定这些字节序列存在吗?对于二进制文件,我会分块读取(并从前一个块中取出最后 5 个字节用于下一次测试,以确保您不会错过部分匹配)。
    • 是的,他们肯定是,我可以在十六进制编辑器“查找选择”搜索条件中找到每个标题实例。猜测有 1000 x 3 种不同类型的标题,这就是为什么我想要一个脚本来计算和打印确认的总数。读取块将不起作用,因为元数据的长度可能会有所不同,这就是为什么搜索标头字节序列是最好的选择 afaik。
    • @Python_newbie: 那么头部不包含任何长度信息呢?
    • 我终于让它工作了,基本上我使用了 .count 属性并以'rb'模式打开文件,然后在分配的“数据”中读取整个文件,然后进入“数据。 count("(\x00(\x00(\x00")) 它返回 1363
    猜你喜欢
    • 2019-06-01
    • 2014-06-07
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2023-03-29
    • 2013-12-23
    相关资源
    最近更新 更多