初心者だけどPerlが大好き

コードが世界を変える!

画像はバイナリファイルなのだ

画像をメモ帳やエディタで開いても無意味だけど
それでも 文字で出来ていることはわかりました。
「バイナリ」とは、実は「2進数」のことを指します。
コンピューター言語は 0と1 の世界なんです。
0と1の区別しかできないおバカなコンピューターと我々は闘っているわけです。
全てのファイルは本質的にはバイナリファイルなのです。

バイナリファイルは、バイナリエディタで閲覧・修正します。
Stirling 使いやすさと高機能を両立した最強の新・定番バイナリエディタ
http://www.vector.co.jp/soft/win95/util/se079072.html


数値を直接書き込むため、サイズが少なく高速です。
行単位という考え方が通用しません。
バイナリモードでは、改行文字が存在しません。

binmode にファイルハンドルをくっつけて バイナリデータと教えます。


#!/usr/bin/perl-w
print "Content-type:image/jpeg\n\n";
$file="111.jpg";
open (IN, $file) or die "$!";
binmode IN;
print while ();
close (IN);


#!/usr/bin/perl
print "Content-type: image/jpeg\n\n";
$file="111.jpg";
open (IN, $file) or die "$!";
binmode IN;
while (read(IN,$buffer,1024)) {print $buffer;}
close (IN);


これは どちらも サーバーにアップした 111.jpgを開くCGIです
どちらも 結果は同じで 画像が表示されます


一般的には read関数を使うことで
while (read($fh,$buffer,1024) でバッファリングして読み込みます。


CGI.pmのモジュールの説明文にありますが、
param関数を呼ぶことで、アップロードされたファイルのファイルパスを返します。
これは、これを読み込むためのファイルハンドルとしても扱えます。
読み込んだファイルは、別ファイルに出力するでしょうから、
次のようにして受信ファイルを扱うことができます。 ・・・・・・として


use CGI;
my $buffer;
my $query = CGI->new;
my $file = $query->param('file');
my $file_name = ($file =~ /([^\\\/:]+)$/) ? $1 : 'uploaded.bin';
open(OUT, ">$file_name") or die(qq(Can't open "$file_name".));
binmode OUT;
while (read($file, $buffer, 1024)) { print OUT $buffer;}close OUT;


とありますが ここでは 新規ファイル $file_nameを作成しています。

while (read($file, $buffer, 1024)) { print OUT $buffer;
として一回を1024バイトを上限として $fileから$bufferに読み込みます
たまった$bufferを 新規ファイル$file_nameに書き込んでいます。
これを繰り返していくときは こんな感じに。
for(i=0; i