2013-05-16 2 views
1

예를 들어 .jpg 파일이나 다른 파일이 있습니다. 나는 그것을 조금씩 읽고 싶다. 나는 이것을한다 :비트 단위로 파일 읽기 및 쓰기

open(FH, "<", "red.jpg") or die "Error: $!\n"; 
my $str; 
while(<FH>) { 
    $str .= unpack('B*', $_); 
} 
close FH; 

그럼 나는 $ str에 0101001의 파일을 준다. 그 후에 나는 이것을한다 :

open(AB, ">", "new.jpg") or die "Error: $!\n"; 
binmode(AB); 
print AB $str; 
close AB; 

그러나 작동하지 않는다.

어떻게하면됩니까? 바이트 순서 (크로스 플랫폼)에 관계없이 작동하는 방법은 무엇입니까?

답변

4

문제 : 너무 읽을 때

  1. 당신이있어 binmode 사용하지 않았다.
  2. 이진 파일에 줄이 없기 때문에 한 줄씩 이진 파일을 읽는 것은 의미가 없습니다.
  3. 파일 핸들에 전역 변수를 불필요하게 사용하고 있습니다.
  4. 귀하의 질문에 대한 답변 : unpack을 거꾸로 입력하지 않았습니다.

open(my $FH, "<", "red.jpg") 
    or die("Can't open red.jpg: $!\n"); 
binmode($FH); 
my $file; { local $/; $file = <$FH>; } 
my $binary = unpack('B*', $file); 

open(my $FH, ">", "new.jpg") 
    or die("Can't create new.jpg: $!\n"); 
binmode($FH); 
print $FH pack('B*', $binary);