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

我几乎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; } 

为什么使用未注释的版本会产生比未知的(在中间跳过的字节)更短的文件。 我会理解,如果文件结束会损坏,但生成的文件中间有些不同。 对此有何解释?

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

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

如果你在你的文件之间做一个二进制比较,我猜测你所缺少的字节是CR或LF。