2013-05-16 70 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);