あの模様はどうやって情報を隠しているのか - 0 と 1 の暗号を解き明かす
すべての情報は 0 と 1 でできている
コンピュータの世界では、文字も数字も画像も、すべて 0 と 1 の組み合わせで表現されます。これを「2 進数」と呼びます。たとえば、アルファベットの「A」は 01000001、「B」は 01000010 です。0 と 1 の 8 桁の組み合わせ (8 ビット) で 1 文字を表現します。256 通りの組み合わせがあるので、英数字や記号をすべてカバーできます。
白黒の模様は、この 0 と 1 を目に見える形にしたものです。白いマス = 0、黒いマス = 1。つまり、あの模様は巨大な 2 進数の表なのです。スマホのカメラが白黒を読み取り、0 と 1 に変換し、文字や URL に復元する。これが読み取りの全体像です。
日本語はどうやって格納するのか
英語のアルファベットは 8 ビットで 1 文字を表現できますが、日本語はそうはいきません。ひらがな、カタカナ、漢字を合わせると数万文字あるため、8 ビットでは足りません。日本語は「UTF-8」という方式で、1 文字あたり 3 バイト (24 ビット) を使って表現します。
つまり、同じ文字数でも日本語は英語の 3 倍のデータ量になります。「こんにちは」(5 文字) は 15 バイト、「Hello」(5 文字) は 5 バイトです。白黒の模様に日本語を格納すると、英語よりも模様が大きく (複雑に) なるのはこのためです。URL は英数字だけで構成されるため、模様を小さく保てます。だから多くの場面で、模様には直接テキストではなく URL を格納するのです。
模様の中の「地図」 - どこに何が書いてあるか
白黒の模様は、ランダムに白と黒が並んでいるように見えますが、実は厳密なルールに従って配置されています。模様の中には「地図」のような構造があり、どこに何の情報が書いてあるかが決まっています。
3 つの隅にある大きな四角 (ファインダーパターン) は「ここが模様の端ですよ」という目印です。その近くにある小さなドット列 (タイミングパターン) は「マス目の間隔はこれですよ」という定規の役割を果たします。残りの領域にデータが格納されていますが、データ領域の最初の数マスには「この模様にはどんな種類のデータが入っているか」(数字、英数字、漢字、バイナリ) と「データの長さ」が記録されています。
マスクパターン - 読み取りやすくする最後の仕上げ
データを白黒のマスに変換しただけでは、偶然「黒が大きな塊になる」「白と黒の縞模様ができる」といった偏りが生じることがあります。こうした偏りはカメラの読み取り精度を下げるため、最後に「マスクパターン」という処理を施します。
マスクパターンは、特定のルールに従って白と黒を反転させる処理です。8 種類のマスクパターンが用意されていて、最も偏りが少なくなるパターンが自動的に選ばれます。たとえば「行番号と列番号の合計が偶数のマスを反転する」というルールがあります。この処理により、白と黒がバランスよく分散し、どんなカメラでも安定して読み取れる模様が完成します。
試してみよう - 自分の名前を 2 進数にしてみる
ここまで読んだら、実際に試してみましょう。自分の名前をアルファベットで書き、各文字を 2 進数に変換してみてください。A=01000001、B=01000010、C=01000011... というように、ASCII コード表を検索すれば変換できます。
たとえば「TARO」なら、T=01010100、A=01000001、R=01010010、O=01001111 です。これを並べると 01010100010000010101001001001111 という 32 桁の 0 と 1 の列になります。この 32 個の 0 と 1 を、白と黒のマスに置き換えれば、あなたの名前が模様になります。実際の模様にはこれに加えて誤り訂正データや構造情報が付加されるため、もっと大きくなりますが、基本の仕組みはこれだけです。