二进制中每2048字节删除64字节

时间:2013-08-19 14:35:15

标签: python perl sed binaryfiles xxd

我在这里处于松散状态,这似乎是一个简单的问题,所以我希望有一个简单的答案!

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

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

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

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

提前致谢,

2 个答案:

答案 0 :(得分:2)

你没有显示任何代码,所以我认为你需要帮助包围算法。它实际上非常简单:

  1. 虽然你没有达到STDIN的EOF,
    1. 从STDIN
    2. 读取2112个字节
    3. 从读取的字节中删除从位置1536开始的64字节。
    4. 将剩余的2048个字节打印到STDOUT。
  2. 在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 $!;
    }
    

答案 1 :(得分:-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

了解更多信息