はじめに

PHP でテキストを処理する話は色んな所で聞きますが、 バイナリを処理するのはあまり聞かないので、あえてニッチな所を狙って話をします。

一応、自己紹介

  • 一昨年位まで、数十万ユーザ規模の携帯サイトでアプリ開発をしてました。
  • http://d.hatena.ne.jp/yoya/ にたまに技術ネタを書いてます。

バイナリって?

通常バイナリとテキストは対比して用いられる。
テキストとはデータの内容すべてを人間が読んで理解できる (human-readable) 表現形式を指し、
バイナリとはそうでない表現形式を指すことが多い。
~ Wikipedia より

なので、本発表では、バイナリファイルの事を、

エディタで開いて読めない文字とか記号が表示されるようなファイル。

という事にしておきます。

バイナリの実例

% 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 ファイルですね。

exdump -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 とバイナリ

PHP の string 型でバイナリ処理がつつがなく出来る。というのが 今回、紹介する Tips の肝です。

バイナリ処理第一歩

$data = file_get_contents($argv[1]);
echo strlen($data)."\n";
php strlen.php ~/flash/saitama.jpg
2131
% ls -l saitama.jpg
-rw-r--r-- 1 yoya devel 2131  5月  9 00:54 saitama.jpg

\0 の扱い

C言語出身者から見ると、\0 の扱いが心配になると思います。 確認

確認done


    Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes