ひとりアドベントカレンダー2015 第16日目 〜 PHPer でもバイナリをいじってみたい その1

  • このエントリーをはてなブックマークに追加
  • Pocket

16日目です。

今日から数回に分けて PHP でバイナリプログラミングとかいろいろやってみたいと思います。PHPer のぼくとしては何でも PHP で済ませられればそれに越したことはないですしね。拡張?エクステンション?知らない子ですね。

PHP におけるバイナリ型

弱い動的型付けを持つ PHP ですが、バイナリすなわちバイト列、はなんと文字列型と同じです。バイト列のうち、たまたま文字コードと解釈できるバイトからのみできているものが普通のテキストだというだけで、内部的にはバイトの並びなんてなんだっていいってことでしょうか。 is_string() 関数を使ってこれを確かめてみましょう。このブログのロゴ画像を読み込んだ変数に is_string() を適用させてみます:

 実行結果は以下のとおり:

 たしかに、画像ファイルの中身を読み込んだ変数の型は string 型であると判定されました。また、その string の長さを strlen()  関数で調べてみると、42,283 であり、これは画像ファイルが 42,283バイトであることと一致しています。

 

バイトを操る:ord() と chr()

さて、一般に文字列を構成する「文字」は(ascii コードの範囲内では)0 から 127 までの数(すなわちバイト(の一部))と対応しますね。PHP にはこの対応によって文字とバイトの変換をする関数があります。それが ord()  と chr()  です。

ord()  は文字列の先頭の文字の ascii コード、つまりバイトを返します。(普通、引数には1文字だけからなる文字列を与えることが多そうです。)

 とすると、’a’ という文字の ascii コードである、97 (= 0x61) が得られます:

 chr()  は ord()  の逆関数で、ascii コードから文字を返します:

 

 まとめ

PHP ではバイト列は文字列型と同じであることを見ました。文字列( = バイト列)の構成要素である文字とバイトを互いに変換する関数 ord()  と chr()  を使ってみました。PHP におけるバイナリプログラミングはこのような関数を上手く使っていくことで行います。他にもいろいろな関数があるので次回以降触れていきたいと思います。

  • このエントリーをはてなブックマークに追加
  • Pocket

SNSでもご購読できます。

コメントを残す

*