【问题标题】:Split binary file based on string基于字符串拆分二进制文件
【发布时间】:2015-05-26 20:43:25
【问题描述】:

我有 170 个 1GB 的二进制文件,每当我找到特定的 ASCII 字符串时,我都想在其中拆分它们。其中一些字符串也有换行符。

csplit 似乎是完成这项任务的完美工具,但它似乎不适用于二进制文件。

问题

如果我将搜索字符串转换为十六进制/二进制,这是否会使问题更容易解决,所以它是二进制数据中的二进制搜索?

如果不是,我如何根据 ASCII 字符串拆分二进制文件,其中一些字符串有换行符?

【问题讨论】:

  • 你想要 python、perl 还是 bash 代码?
  • 我对所有这些都是开放的 =) 最容易解决问题的那个 =)
  • csplit 在什么情况下不起作用?
  • binary 文件没有什么特别之处,只是它们通常包含不会出现在文本文件中的字节,而且当你打印它们。它们仍然是必须理解的八位字节序列,大多数体面的语言都可以让你做到这一点。
  • csplit 按行工作。

标签: python linux bash perl split


【解决方案1】:

二进制文件并没有什么特别之处,只是它们通常包含不会出现在文本文件中的数据,而且当您打印它们时它们看起来不太好看。它们仍然是必须理解的八位位组序列,大多数体面的语言都可以做到这一点。

举个例子可能会有所帮助。

您没有描述要用作分隔符的字符串,也没有说明读取每个块后要对它做什么,因此这里有一个读取 1GB 原始文件的 Perl 程序以specific ASCII string 结尾的块中的文件,并一次将它们写入一个新文件。所以它相当笨拙地复制文件。

use strict;
use warnings;

open my $fh, '<:raw', '1GBfile' or die $!;
local $/ = 'specific ASCII string';

open my $out_fh, '>:raw', 'new1GBfile' or die $!;
select $out_fh;

print while <$fh>;

close $out_fh or die $!;

根据您对文件中数据的处理方式,您可能会发现File::Map 很有用

【讨论】:

    【解决方案2】:

    您可以将输入记录分隔符$/ 更改为您要拆分的特定搜索字符串(默认情况下,它是换行符)。然后在读取输入文件时,将每条记录打印到一个新的唯一文件中:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    # change the input record separator to whatever string you want
    $/ = "SOME STRING";
    
    my $file_num = 0;
    while (my $data = <>) {
      chomp $data; # remove input record separator
      my $file = "file." . ++$file_num;
      open my $fh, '>', $file or die "can't open file: $file: $!\n";
      print $fh $data;
      close $fh;
    }
    

    【讨论】:

    • 这在 Windows 上不起作用,因为在您的程序看到数据之前,Perl IO 层 :crlf 已经删除了回车符 "\x0D"。它也不适用于旧式 Mac 机器,但可能性较小。
    • 谢谢@Borodin。很高兴知道。在这种情况下,OP正在寻找Linux的解决方案,但最好争取跨平台兼容性。
    • 这就是为什么它是一个 comment :) 许多人没有得到的是 Stack Overflow 不是一个论坛,可以讨论个人的问题以找到他们解决方案,但更多的是解决编程问题的维基百科。 OP 在您要满足的人员列表中应该非常低,因为如果这是一个好问题,那么将有另外一千人跟随他们寻找类似问题的解决方案。如果其他人发现您的解决方案看起来应该按照他们的意愿行事,那么您让他们失望了。
    • 在 Windows 上关闭 :crlf 层很简单。或为其他平台打开它。
    • @mob:是的,这很简单。但知道这是必要的更多的是机会游戏
    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 2010-12-21
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多