【问题标题】:Splitting a binary file with 0xff stuffing使用 0xff 填充分割二进制文件
【发布时间】:2014-08-13 15:20:07
【问题描述】:

我想将一个二进制文件拆分为多个子文件,这些子文件以前缀后跟十进制偏移量命名,例如prefix-3200.bin, prefix-3201.bin

我发现我可以用

分割我的文件
split -b128k -d input.bin

生成名为 x00、x01、x02、...的文件

不幸的是,我仍然需要翻译块名称并用​​ 0xff 填充最后一个块,因为我所有的块都应该具有相同的 128kB 大小。

我正在考虑使用 Perl 来完成这项工作,但如果我只能使用标准 GNU 工具会更好。

如何轻松重命名和填充我的最后一个二进制块?

我试图用 dd 来处理这个:

dd if=/dev/zero ibs=1k count=128 | tr "\000" "\377" > block
dd if=block of=block conv=notrunc

编辑:

我现在可以使用

生成正确的prefix-XXXX
split -b128k -d -a4 input.bin prefix-

【问题讨论】:

  • rename$buf = substr($buf . ("\xFF" x (128*1024)), 0, 128*1024);
  • 另外,split 将前缀作为最后一个参数。

标签: linux perl file split binary


【解决方案1】:

在 GNU 拆分后,您可以使用以下 split 命令:

split -b128k --additional-suffix=".bin" -a4 --numeric-suffixes=3200 INPUT_FILE "prefix-"

但是,之后您需要用0xFFs 显式填充最后一个文件。您可以使用dd,如here 所述

【讨论】:

  • 遗憾的是,我的拆分 8.15 没有 --additional-suffix 选项
  • 啊,好的。很高兴知道这不是便携式的。将在我的答案中明确添加GNU split
【解决方案2】:
my $block_size = 128*1024;

open(my $fh_in, '<:raw', 'input.bin') or die $!;

local $/ = \$block_size;
my $counter = 0;
while (<$fh_in>) {
   open(my $fh_out, '>:raw', sprintf("prefix-%04d.bin", $counter++)) or die $!;
   $_ = substr($_.("\xFF" x $block_size), 0, $block_size);
   print($fh_out $_);
}

【讨论】:

  • 大部分人都能看出这是perl。为什么这比使用split 更好,或者至少我为什么要使用它?
  • @wojciii,因为split 不能满足 OP 的需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2021-02-10
  • 2012-05-21
  • 2012-05-28
相关资源
最近更新 更多