2

たとえば、.jpg ファイルやその他のファイルがあります。少しずつ読みたい。私はこれをします:

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

ファイルの 0101001 で $str が得られます。その後、私はこれを行います:

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

しかし、うまくいきません。

どうすればいいですか?バイトオーダー(クロスプラットフォーム)に関係なく機能するようにする方法は?

4

1 に答える 1

5

問題:

  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);
于 2013-05-17T00:25:57.193 に答える