【问题标题】:Remove 64 Bytes every 2048 bytes in Binary [closed]二进制中每 2048 个字节删除 64 个字节 [关闭]
【发布时间】:2013-08-21 09:46:45
【问题描述】:

我在这里很困惑,这似乎是一个简单的问题,所以我希望有一个简单的答案!

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

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

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

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

提前致谢,

【问题讨论】:

  • 随机的反对票是怎么回事?
  • “二进制”在什么容器中,一个文件?结果去哪儿了?
  • @devnull 我真的看不出这个问题有什么离题的地方。
  • @M42 我真的看不出这个问题有什么离题的地方。
  • @msw 我真的看不出这个问题有什么离题的地方。

标签: python perl sed binaryfiles xxd


【解决方案1】:

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

  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 $!;
}

【讨论】:

  • 完美,非常感谢!
【解决方案2】:

如果你想使用 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

更多信息

【讨论】:

  • 它可以用 sed 完成(如你所料),我只是不确定 OP 是要跳过 2k delete 64b、跳过 2k delete 64b 还是跳过 2k delete 64b skip 1984b delete 64b...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2017-08-15
  • 2010-11-05
  • 1970-01-01
  • 2013-12-18
  • 2013-06-23
相关资源
最近更新 更多