2012-01-20 110 views
1

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

爲什麼使用未註釋的版本會產生比未被佔用的(在中間跳過的字節)更短的文件。我會理解,如果文件結尾會損壞,但生成的文件在中間某處不同。對此有何解釋?

不幸的是,我不允許上傳重現問題的文件。

+0

也許你正在編輯損壞存檔內gzip流的字節。什麼錯誤出現? –

+0

亞歷克斯,我還沒有做任何事情。我只需要查找字節數並將其寫入另一個文件並嘗試使用存檔器打開它(僅用於測試)。 *評論while循環*結果與損壞的文件和* uncomented while循環*正常工作。 – teodozjan

回答

4

對二進制文件使用類似foreach(<$src>)的結構通常不是很好,因爲它是以行模式讀取的(而二進制文件沒有行的概念)。

如果你在你的文件之間做一個二進制比較,我猜你丟失的字節是CR或LF。

相關問題