Почему перезапись бинарного файла не работает? - PullRequest
1 голос
/ 20 января 2012

У меня почти файл 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 Ответ

4 голосов
/ 20 января 2012

Использование таких конструкций, как foreach(<$src>), для двоичных файлов, как правило, не очень хорошо, поскольку оно читает в режиме строки (а двоичные файлы не имеют понятия линий).

Если вы проведете двоичное сравнение между вашими файлами, я бы предположил, что пропущенные байты являются либо CR, либо LF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...