为什么重写二进制文件不起作用?

时间:2012-01-20 11:16:52

标签: windows perl

我有几乎tar.gz文件。我需要在解压缩之前跳过一些字节,然后解压缩它,改变一些东西并重新打包。

 #!perl

 open (my $src, "<", $path) or die $!;
 binmode($src);
 seek($src, $magicNumber,0);

 open(my $tgz, ">", $path . ".tar.gz");
 binmode($tgz);

 #while(<$src>){
 #    print $tgz $_;
 #}
 my $n; my $data;
 while(($n = read $src, $data, 4) != 0){
     print $tgz $data;
 }

为什么在使用未注释的版本时生成的文件比未启动的文件短(在中间跳过字节)。我会理解文件末尾是否会被破坏但生成的文件在中间某处有所不同。对此有何解释?

不幸的是我不允许上传重现问题的文件。

1 个答案:

答案 0 :(得分:4)

对于二进制文件使用foreach(<$src>)这样的结构通常不是很好,因为它以行模式读取(并且二进制文件没有行的概念)。

如果你在文件之间进行二进制比较,我猜你丢失的字节是CR或LF。