アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

PHPでバイナリプログラミングその2 テキストとは何か

こんにちは、久保田です。

引き続き、PHPでのバイナリプログラミングについて話をしていきます。
前回の記事ではバイト列をPHPで扱えるデータに変換する方法を説明しました。

今回はPHPの数値をバイト列に変換する方法を説明しますが、その前に前回説明したバイナリの定義を少し思い出してみましょう。



<blockquote>バイナリとは、ざっくりと言えばテキスト以外のバイト列のことです。</blockquote>


と前回言いましたが、そもそもテキストとはなんでしょうか?

バイナリとはテキスト以外のものであると言ってもまずテキストがなんなのかわからなければ意味がありません。この記事では、PHPの数値をバイト列に変換する方法と共に、テキストとは具体的にはなんなのかを説明していきます。

テキストとは

テキストとは、文字エンコーディング方式に沿ったバイト列の事です。
以下のコードを見てください。



<?php // sample.php
echo pack('C*', 0x50, 0x48, 0x50, 0x21) . PHP_EOL;


pack関数は前回の記事に説明したunpack関数と逆のことをやってくれる関数です。具体的にはPHPの数値をバイト列に変換してくれます。 このコードでは、pack関数を使ってPHPの数値(この例では0x50, 0x48, 0x50, 0x21)をバイト列に変換してそれを出力しています。

コマンドラインでこれを実行すると以下のようになります。



$ php sample.php
PHP!


PHP!」と表示されています。この例からバイト列はそれぞれ以下のように対応していることがわかると思います。



0x50 => P
0x48 => H
0x50 => P
0x21 => !


PHP!」以外の文字でも、どのバイト表現にどの文字を割り当てるかどうかは当然ながら定義されています。 この対応を定義しているのが文字エンコーディング方式です。

ASCII文字コードのコード表を見てみましょう。ASCIIで表現される文字集合は小さいので、簡単にどういう対応を持っているかを把握することができます。英語のアルファベットがどのバイト表現に対応しているかが一目瞭然です。

上述した例では文字エンコーディングに従って手動で数値からバイト列を生成し出力しました。 その結果、普段誰もがよく目にしているテキストが表示されました。

テキストとは文字エンコーディング方式に沿ったバイト列である、というのはそういうことです。

普段よく使われている文字コードは、Shift_JISUTF-8EUC-JPなどASCIIとは違ったものですが、アルファベットや数字、一バイトの記号などのエンコーディングはどれもASCII文字コードに従っています。これは利用者や開発者などにとって都合がいいからで、例えばシステムの文字コードがなんであれ英語のアルファベットなどが日本語と違って文字化けしたりしないのはこれのためです。

まとめ

pack関数を用いることでPHPの数値をバイト列に変換できる
・ テキストとは、文字エンコーディング方式に沿ったバイト列である
・ 文字エンコーディング方式は、バイト表現と文字の対応である

では、次回は実際にバイナリファイルを読み込む例を紹介したいと思います。