-1

我在这里不知所措,这似乎是一个简单的问题,所以我希望有一个简单的答案!

我有一个二进制文件(大约 35m),从偏移量 1536 开始,每 2048 个字节有 64 个字节的填充数据 - 我只想删除这个填充。

第一次出现是 1536,然后是 3648、5760、7872 等

(2112 字节 - 64 字节的虚拟数据 = 2048)

我已经尝试过 bvi、bbe、hexdump+sed+xxd,但我显然遗漏了一些东西。

提前致谢,

4

2 回答 2

2

您没有显示任何代码,所以我认为您需要帮助来了解算法。其实很简单:

  1. 虽然你还没有达到 STDIN 的 EOF,
    1. 从 STDIN 读取 2112 个字节
    2. 从读取的字节中,删除从位置 1536 开始的 64 个字节。
    3. 将剩余的 2048 字节打印到 STDOUT。

在 Perl 中,

binmode(STDIN);
binmode(STDOUT);
while (1) {
   my $rv = read(STDIN, my $rec, 2112);
   die $! if !defined($rv);
   last if !$rv;

   substr($rec, 1536, 64, '');

   print($rec)
      or die $!;
}
于 2013-08-19T14:41:57.613 回答
-1

如果你想使用 Perl:

打开带有:raw图层的文件。我们不想要:utf8:crlf翻译。

然后,我们可以搜索到我们感兴趣的位置,并且可以读取几个字节

my $size = -s $filename;
open my $fh, "<:raw", $filename;
for (seek($fh, 1536, 0) ; tell($fh) + 2048 < $size ; seek($fh, 2048 - 64, 1)) {
  read $fh, my $buffer, 64;
  ...;
}

  • perldoc -f tell
  • perldoc -f seek
  • perldoc -f read

了解更多信息

于 2013-08-19T14:42:25.320 回答