まいど。独極・QRコード担当の「あじな」です。
今回からは「英数字モード」の解説に入ります。
ということで、今回の解説はしゅーりょー!・・・ってわけにはいかないですね。
まず、「英数字モードのデータ構造」ですが「数字モード」の構造とまったく同じです。念のため、もう一度書いておきます。
「モード指示子」+「文字数指示子」+「データ+終端パターン」+「埋め草ビット」+「埋め草ワード」
「モード指示子」は、前回説明したように、「英数字モード」は「0010」ですね。
前回書いたものを再度書いておきますね。
次に、「英数字モード」の「文字数指示子」についてです。
QRコードのバージョンによって桁数が変わるのでしたね。「英数字モード」の場合の「文字数指示子」の桁数は次の表のとおりです。
「データ」部分の解説は後回しにするとして、「終端パターン(「0000」)」、「埋め草ビット(データ領域の桁数が8の倍数になるように「0」を入れる)」「埋め草ワード(QRコードのバージョン・エラー訂正レベルで決まる容量を満たすように「11101100」と「00010001」を交互に入れる)」は「数字モード」と全く同じです。
早速、作り方をステップを追って説明しましょう。
・・・。
わかりますよ。皆さんのいらだつ視線が。
次回の解説で実例をあげますので、もう少し我慢してください。
ちなみに、今回の解説の中で「2桁のうち、はじめの文字を数字に置き換えたものを45倍し、2番目の文字を数字に置き換えたものと足す」という部分がありますよね。
なぜ45倍?なぜ足す?って気分になりますよね。
実はこれも「もったいない」の精神なんです。QRコードの本質ではないので、詳しく書かないですが、概要だけ説明しておきましょう。
まず「45」とは何からきているかというと、「英数字モード」で扱える文字種類「45種類」からです(この解説の最後に表をつけているので数えてみてください)。
先ほどのエンコードの方法で説明したように、2桁ずつに区切ってエンコードする(例えば、「QR」だったら「26, 27」です)ので、くっつける際にはそのまま並べてしまうのが自然です(例えば「QR」は「2627」と書くとか・・・)。
でも、ちょっと考えてみてください。この「このままくっつける」という行為は、実は、「はじめの数字を100倍して、後ろの数字と足すということと同じ」なんです(「\(26 \times 100 + 27=2627\)」ですね)
QRコードの「英数字モード」の場合は、ここで「100倍」するのではなく、「45倍」しているんです。
例えば、1文字目を数字に変換したものを\(x\)として、2文字目を数字に変換したものを\(y\)とすると、「英数字モード」で計算した結果は「\(45x+y\)」です。
では、ここから元の\(x\)、\(y\)を算出してみましょう。「\(45x+y\)」を\(45\)で割り算するとどうなるでしょうか?
割り算をした結果は「\(x+\frac{y}{45}\)」になります。そして、\(y\)は45未満なので「\(\frac{y}{45}\)」は1未満になります。一方で\(x\)は「整数」です。
つまり、「\(x+\frac{y}{45}\)」の整数部分だけ取り出すと\(x\)がわかるのです。そして、「\(45x+y\)」から「\(45x\)」を引き算すると\(y\)が求まります。
もし、\(y\)が45以上になる場合は、うまくはいきません。だって、「\(x+\frac{y}{45}\)」の「\(\frac{y}{45}\)」の部分が1以上になってしまうと、\(x\)が増えてしまうから、もとの\(x\)を推測できません。
文字が45種類だからこそ、「45倍」することでうまくいくんです。
当然、100倍して足し算するより、45倍して足し算したほうが数は小さくなり、結果、2進数で必要な桁数も少なくなりますよね。このような方法をとると桁数の節約ができるんです。
次は、「英数字モード」の実例を解説しますよん。
今回の解説の最後に、「英数字モード」の「文字と数字の変換表」を書いておきます。
今回からは「英数字モード」の解説に入ります。
これまでの復習 [表示する]
- QRコードは株式会社デンソーが作ったもので、スマホや携帯で読み取れる
- QRコードは「小さな白と黒の四角でできている」「多少汚れても大丈夫」という特徴がある
- 白黒の四角を使うのは、コンピュータにわかりやすくさせるため
- QRコードは「機能パターン」と「符号化領域」で出来上がっている
- 「機能パターン」は、「クワイエットゾーン」「位置検出パターン」「位置検出パターンの分離パターン」「タイミングパターン」「位置合わせパターン」の5種類
- 「符号化領域」は「形式情報」「型番情報」「データ領域」の3種類
- 「形式情報」は「エラー訂正レベル」と「マスクパターン参照子」で決まり、「\(4 \times 8=32\)」種類のパターンがある
- 「型番情報」は「QRコードのバージョンによって決まり、40種類ある
- 「データ領域」は「データ」と「エラー訂正情報」で出来上がる
- QRコードはバージョンが1~40まである。一辺の大きさは、「QRコードのバージョン(1~40)\( \times \)4\( + \)17」
- 「エラー訂正レベル」は「L(7%の汚れまで)」「M(15%の汚れまで)」「Q(25%の汚れまで)」「H(30%の汚れまで)」の4種類ある
- 「1bit」とは「白・黒」、「1・0」のような2種類の情報を表すことができる能力のことで、文字を増やすと「2bit(4種類)」「3bit(8種類)」と表現できる種類が増える
- 日常の言葉を「エンコード」して「コード(符号)」に置き換え、「コード(符号)」を「デコード」して日常の言葉に戻す
- QRコードの「エンコード」方式は「数字モード」「英数字モード」「漢字モード」「8bitモード」の4種類
- どの「エンコード」方式でも、データは「モード指示子」+「文字数指示子」+「データ」+「終端パターン」+「埋め草ビット」+「埋め草ワード」となる
英数字モード
「英数字モード」はほとんど前回解説した「数字モード」と同じです。ということで、今回の解説はしゅーりょー!・・・ってわけにはいかないですね。
まず、「英数字モードのデータ構造」ですが「数字モード」の構造とまったく同じです。念のため、もう一度書いておきます。
「モード指示子」+「文字数指示子」+「データ+終端パターン」+「埋め草ビット」+「埋め草ワード」
「モード指示子」は、前回説明したように、「英数字モード」は「0010」ですね。
前回書いたものを再度書いておきますね。
モード | モード指示子 |
---|---|
数字モード | 0001 |
英数字モード | 0010 |
8bitモード | 0100 |
漢字モード | 1000 |
次に、「英数字モード」の「文字数指示子」についてです。
QRコードのバージョンによって桁数が変わるのでしたね。「英数字モード」の場合の「文字数指示子」の桁数は次の表のとおりです。
バージョン | 文字数指示子の桁数 |
---|---|
1~9 | 9 |
10~26 | 11 |
27~40 | 13 |
「データ」部分の解説は後回しにするとして、「終端パターン(「0000」)」、「埋め草ビット(データ領域の桁数が8の倍数になるように「0」を入れる)」「埋め草ワード(QRコードのバージョン・エラー訂正レベルで決まる容量を満たすように「11101100」と「00010001」を交互に入れる)」は「数字モード」と全く同じです。
英数字モードのデータ
今回のメインディッシュです。「データ領域」は、さすがに「数字モード」とは全然違います。早速、作り方をステップを追って説明しましょう。
- エンコードしたいデータを「2桁ずつ」に区切ります。
- 2桁の文字を、それぞれ、決められた表に従って数字に変えます。
- 2桁のうち、はじめの文字を数字に置き換えたものを45倍し、2番目の文字を数字に置き換えたものと足します。(不思議ですね)
- 足し算した数字を11桁の2進数に変換します。
・・・。
わかりますよ。皆さんのいらだつ視線が。
次回の解説で実例をあげますので、もう少し我慢してください。
ちなみに、今回の解説の中で「2桁のうち、はじめの文字を数字に置き換えたものを45倍し、2番目の文字を数字に置き換えたものと足す」という部分がありますよね。
なぜ45倍?なぜ足す?って気分になりますよね。
実はこれも「もったいない」の精神なんです。QRコードの本質ではないので、詳しく書かないですが、概要だけ説明しておきましょう。
まず「45」とは何からきているかというと、「英数字モード」で扱える文字種類「45種類」からです(この解説の最後に表をつけているので数えてみてください)。
先ほどのエンコードの方法で説明したように、2桁ずつに区切ってエンコードする(例えば、「QR」だったら「26, 27」です)ので、くっつける際にはそのまま並べてしまうのが自然です(例えば「QR」は「2627」と書くとか・・・)。
でも、ちょっと考えてみてください。この「このままくっつける」という行為は、実は、「はじめの数字を100倍して、後ろの数字と足すということと同じ」なんです(「\(26 \times 100 + 27=2627\)」ですね)
QRコードの「英数字モード」の場合は、ここで「100倍」するのではなく、「45倍」しているんです。
例えば、1文字目を数字に変換したものを\(x\)として、2文字目を数字に変換したものを\(y\)とすると、「英数字モード」で計算した結果は「\(45x+y\)」です。
では、ここから元の\(x\)、\(y\)を算出してみましょう。「\(45x+y\)」を\(45\)で割り算するとどうなるでしょうか?
割り算をした結果は「\(x+\frac{y}{45}\)」になります。そして、\(y\)は45未満なので「\(\frac{y}{45}\)」は1未満になります。一方で\(x\)は「整数」です。
つまり、「\(x+\frac{y}{45}\)」の整数部分だけ取り出すと\(x\)がわかるのです。そして、「\(45x+y\)」から「\(45x\)」を引き算すると\(y\)が求まります。
もし、\(y\)が45以上になる場合は、うまくはいきません。だって、「\(x+\frac{y}{45}\)」の「\(\frac{y}{45}\)」の部分が1以上になってしまうと、\(x\)が増えてしまうから、もとの\(x\)を推測できません。
文字が45種類だからこそ、「45倍」することでうまくいくんです。
当然、100倍して足し算するより、45倍して足し算したほうが数は小さくなり、結果、2進数で必要な桁数も少なくなりますよね。このような方法をとると桁数の節約ができるんです。
次は、「英数字モード」の実例を解説しますよん。
今回の解説の最後に、「英数字モード」の「文字と数字の変換表」を書いておきます。
文字 | 変換数字 |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
A | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
G | 16 |
H | 17 |
I | 18 |
J | 19 |
K | 20 |
L | 21 |
M | 22 |
N | 23 |
O | 24 |
P | 25 |
Q | 26 |
R | 27 |
S | 28 |
T | 29 |
U | 30 |
V | 31 |
W | 32 |
X | 33 |
Y | 34 |
Z | 35 |
(半角スペース) | 36 |
$ | 37 |
% | 38 |
* | 39 |
+ | 40 |
- | 41 |
. | 42 |
/ | 43 |
: | 44 |