バイナリTweetこんにちは、久保田です。これまでの記事では、PHPでバイナリを扱うための基本的な事柄を扱ってきました。第一回では、PHPではバイナリをどのように扱えばいいのか、第二回では、そもそもバイナリの反対のテキストとは何か、ということについて記述しました。今回の記事では、例として実際にPHPでGIF画像をどのように解釈していくかを解説します。バイナリを扱うコードを書く際の手順ではGIF画像をPHPで扱う前に、まずは一般的にバイナリを扱うコードを書く際の手順の例を以下に大雑把に示します。プログラミング言語で実際に扱ってみるバイナリファイルはその種類によって各々が違ったフォーマットを持っています。GIF画像とPNG画像にしても同じ画像ですが、当然ながら内部のフォーマットは全く違います。従って、自分がこれから扱いたいバイナリのフォーマットに関する資料を集めます。GIFはよく利用される画像フォーマットであり、かつ内部構造もそれなりにシンプルでわかりやすく、日本語の資料も比較的多く存在します。資料をある程度集めたら、その資料を読み込んでそのバイナリがどういったフォーマットを持つのかについて理解します。この時、適当な例となるバイナリを用意してバイナリエディタで中身を確認しつつやると理解しやすいです。フォーマットを理解すれば、あとは実際にコードを書いて、目的に応じてバイナリを読み込んだり書きだす処理を記述します。GIF画像のフォーマットを理解するでは早速GIF画像のフォーマットについて説明していきます。以下では、GIF画像のフォーマットについてその概要を示しています。"\x3b"-------------------------GIF画像のフォーマットは、複数のセクションによって構成されています。基本構造としては、まずHeaderがあり、その後に任意の数のBlockがあり、最後にTrailerがあって終りとなります。フォーマットの末尾を表すTrailerを除いて各セクションの大きさは決まっておらず、パースしながらそのセクションの大きさは決定されます。従って、GIF画像の内部データを読み込む際には、GIFフォーマットではバイナリを上から順に読んでいく必要があります。HeaderセクションHeaderには、GIF画像の大きさ、カラーテーブル、色数などのイメージに関する基本的な情報が以下のように格納されています。以下に概要を図で表します。バイト)-------------------------------------------シグネチャはこのバイナリファイルがGIF画像であることを表します。バージョンは、GIFのバージョンが格納されます。今のところ"87a"か"89a"のみです。アニメーションGIFが利用出来るのは"89a"のバージョンです。次に画像の横幅縦幅が格納されます。リトルエンディアンで格納されているので注意です。その後に各種フラグや背景色のインデックス、ピクセルのアスペクト比などが格納されます。カラーテーブルの大きさは、各種フラグの1バイト内に含まれています。カラーテーブルがヘッダに含まれていない場合、ヘッダのサイズは13バイトとなります。Headerセクションを実際にバイナリエディタで覗いて確認してみましょう。サンプルとなる画像を以下に用意しました。これのヘッダをバイナリエディタで読んでみましょう。使うバイナリエディタはなんでもいいのですが、筆者はBzを使っています。最初にシグネチャ"GIF"とバージョン"89a"があることがわかります。その次には画像の横幅を表す"\x2c\x01"があります。0x012cを10進数に直すと300、つまり画像の横幅の大きさである300pxということです。次の縦幅を表す2バイトも同様です。その次には各種フラグを格納する"\xf2"があります。最初の1ビットはヘッダにカラーテーブルを持つか、次の3ビットは色深度、次の1ビットはカラーテーブル内の色がソート済みかどうか、次の3ビットはカラーテーブルのサイズを表します。従ってこの画像の場合は以下のような情報を読み取ることができます。765というような感じでバイナリのデータを読み進めていくことにします。ヘッダのフォーマットを理解したところで、実際にこれを扱うPHPの関数を書いてみると以下のようになります。画像を文字列として読み込み、unpack関数を使ってPHPの型に変換します。コード自体は非常に単純で難しいところは無いと思います。);}これを上で挙げたサンプルのGIF画像に適用してダンプすると、以下のようになります。バイナリエディタから読んだ情報と一緒であることがわかると思います。}}Blockセクション上では、GIFのヘッダのフォーマットを理解し、それを扱うコードを書いてきました。記事を書いてきてだんだん面倒になってきたというのもあるのですが、ヘッダ以降のブロックのパースなどは上でやった手順で自分でもやってみましょう。GIFフォーマットに関する資料も以下に代表的なものをリストにしておきます。GIF89Aの仕様書また、バイナリの中身を覗く際のバイナリエディタも色々ありますので好みのものを選びましょう。・Stirling・Bz・xedit結論この記事では、バイナリを扱うコードを書く際の手順をGIF画像を例に解説しました。バイナリを扱うのは、バイナリ特有の事情さえ把握していれば誰でもできる簡単なものです。何かバイナリを弄ったりしたい場合は、何らかのツールを使ったり、誰かが作った拡張ライブラリを使うだけでなく、自分でコードを書くことも選択肢の一つとして検討することをおすすめします。byスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。