2012-01-20 18 views
1

私はほとんどtar.gzファイルを持っています。私はアンパックする前にいくつかのバイトをスキップする必要がありますし、それをuntarし、何かを変更し、再度パックします。なぜバイナリファイルを書き直すことができないのですか?

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

コメントを外しバージョンgeneretesにuncomentedより短いファイルを使用している場合(バイトが途中でスキップ)なぜ。私はファイルの終わりが壊れているが、生成されたファイルが途中でどこか違うかどうかを理解するだろう。これについての説明は?

残念ながら、問題を再現するファイルをアップロードすることはできません。

+0

おそらく、アーカイブ内のgzipストリームが壊れているバイトを編集していることが考えられます。どのようなエラーが表示されますか? –

+0

アレックス、私はまだanythinをやっていません。私はちょうどバイト数を求めて別のファイルに書き出し、それをアーカイバで開こうとします(テストの場合のみ)。 * whileループの結果が破損したファイルと* uncomented whileループ*がうまく動作します。 – teodozjan

答えて

4

バイナリファイルの場合、foreach(<$src>)のような構文を使用すると、行モードで読み込み(バイナリファイルに行の概念がないため)、一般的にあまり良くありません。

ファイル間のバイナリ比較を行う場合は、欠落しているバイトがCRまたはLFのいずれかであると推測します。

関連する問題