2012-01-20 4 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라고 ​​추측 할 수 있습니다.

관련 문제