http://events.php.gr.jp/events/show/96 はじめにPHP でバイナリ処理の話をあまり聞かないので、あえてニッチな所を狙って発表させて頂きます。
PHP というより、バイナリの勉強会といった要素が強いですが、 多分…、いつかお役に立てると思いますので、どうか、ご容赦ください。 一応、自己紹介
まずは、バイナリの定義
なので、本発表では、バイナリファイルの事を、 テキストエディタで開いて読めない文字とか記号が表示されるようなファイル。 という事にしておきます。 バイナリの実例% hexdump -C aria.gif 00000000 47 49 46 38 39 61 c8 00 96 00 f7 00 00 00 00 00 |GIF89a..........| 00000010 ff ff ff 96 53 58 29 1b 1c e6 b0 b8 b2 69 76 37 |....SX)......iv7| 00000020 26 29 d6 96 a1 cb c6 c7 34 1c 22 48 31 38 2b 21 |&)......4."H18+!| <略> GIF ファイルですね。 $ hexdump -C kuriboo.png 00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR| 00000010 00 00 00 c0 00 00 00 e0 08 06 00 00 00 55 70 69 |.............Upi| 00000020 31 00 00 00 04 73 42 49 54 08 08 08 08 7c 08 64 |1....sBIT....|.d| <略> PNG です。 先頭の4文字を見ると何か分かる事が多いのですが、その後ろにはよく分からないデータが続いてます。 このよく分からないデータを PHP で改変する方法について、今回はお話します。 PHP とバイナリPHP の string 型でバイナリ処理が簡単に出来る。というのが 今回、紹介する Tips の肝です。 (注) PHP6 では UTF-8 対応したり取りやめたりと怪しいので、今回の発表はとりあえず、PHP5(PHP4 も多分大丈夫) only での話しだと思ってください。 本当にバイナリ処理できるの?\0 は?C言語が典型例ですが、\0 を文字列が終わったマークとして使う処理系も 結構あるので、string型をバイナリデータとして使う場合、途中で切れないか。 特に、C言語出身者は心配になると思います。
$s = "This is TEST\n"; $s{3} = "\0"; echo strlen($s)."\n"; echo $s; 13 Thi is TEST
8bitスルー?
$s = ' '; $s{3} = 'A'; $s{4} = chr(ord('A') | 0x80); var_dump(bin2hex($s)); string(10) "20202041c1"
バイナリを取り込んでそのまま出力
$data = file_get_contents($argv[1]); echo $data; % php echo.php saitama.jpg > output.dat % md5sum saitama.jpg output.dat 06f741dca38937df3702f6759aead28b saitama.jpg 06f741dca38937df3702f6759aead28b output.dat
byte処理
試してみましょう。 JPEG の解析初めの一歩
% hexdump -C aria.jpg 00000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60 |......JFIF.....`| 00000010 00 60 00 00 ff e1 00 22 45 78 69 66 00 00 49 49 |.`....."Exif..II| 00000020 2a 00 08 00 00 00 01 00 00 51 04 00 01 00 00 00 |*........Q......| <略>
マーカ・コード 長さ データ FFxx(16bit) 16bit 可変サイズ
00000000 ff d8 ff e0 00 10 ... ~~~~~ ~~~~~~~~~~~~~~~ SOI APP0
分割してみる
欲しい情報を探してみる
bit処理
その他Tips
|