TITLE: PHP でバイナリプログラミング #contents * はじめに [#v18439f5] PHP でテキストを処理する話は色んな所で聞きますが、 バイナリを処理するのはあまり聞かないので、あえてニッチな所を狙って発表させて頂きます。 * 一応、自己紹介 [#l413a7de] - 一昨年位まで、数十万ユーザ規模の携帯サイトでアプリ開発をしてました。 - http://d.hatena.ne.jp/yoya/ で、たまに技術ネタを書いてます。 * バイナリって? [#vd6a4a1e] 通常バイナリとテキストは対比して用いられる。 テキストとはデータの内容すべてを人間が読んで理解できる (human-readable) 表現形式を指し、 バイナリとはそうでない表現形式を指すことが多い。 ~ Wikipedia より なので、本発表では、バイナリファイルの事を、 エディタで開いて読めない文字とか記号が表示されるようなファイル。 という事にしておきます。 * バイナリの実例 [#z1197160] % 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 kuriboo4.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 とバイナリ [#e5d1b7d7] PHP の string 型でバイナリ処理がつつがなく出来る。というのが 今回、紹介する Tips の肝です。 * \0 は? [#ta2f5d12] string型をバイナリデータとして使う場合、 C言語出身者から見ると、\0 で終端されないか心配になると思います。 - 確認 $s = "This is TEST\n"; $s{3} = "\0"; echo strlen($s)."\n"; echo $s; 13 Thi is TEST 確認done * MSB は? [#e87fe524] $s = ' '; $s{3} = 'A'; $s{4} = chr(ord('A') | 0x80); var_dump(bin2hex($s)); string(10) "20202041c1" 扱えます。8bit スルーです。 * バイナリ処理第一歩 [#c36d6b3f] $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処理 [#y43196b3] * bit処理 [#mda8635b] * その他 [#o4b9d5e0] - PHP の閉じタグ ?> は使わない。?> の後ろに改行やゴミ文字があった場合に、テキストなら最後にゴミが付くだけで大きな問題になりにくいが、バイナリだと致命的。 |