QRコードの概要
符号化(エンコード)
エラー訂正の概要
エラー訂正に必要な「行列」の解説
「行列」を使ってエラー訂正をしよう
リード・ソロモン符号とエラー訂正の方法
多項式の割り算
リード・ソロモン符号の作り方
ガロア理論と体
QRコードを作ろう
QRコードメーカー
まいど。独極・QRコード担当の「あじな」です。
今回からは「英数字モード」の解説に入ります。

これまでの復習 [表示する]

  1. QRコードは株式会社デンソーが作ったもので、スマホや携帯で読み取れる
  2. QRコードは「小さな白と黒の四角でできている」「多少汚れても大丈夫」という特徴がある
  3. 白黒の四角を使うのは、コンピュータにわかりやすくさせるため
  4. QRコードは「機能パターン」と「符号化領域」で出来上がっている
  5. 「機能パターン」は、「クワイエットゾーン」「位置検出パターン」「位置検出パターンの分離パターン」「タイミングパターン」「位置合わせパターン」の5種類
  6. 「符号化領域」は「形式情報」「型番情報」「データ領域」の3種類
  7. 「形式情報」は「エラー訂正レベル」と「マスクパターン参照子」で決まり、「\(4 \times 8=32\)」種類のパターンがある
  8. 「型番情報」は「QRコードのバージョンによって決まり、40種類ある
  9. 「データ領域」は「データ」と「エラー訂正情報」で出来上がる
  10. QRコードはバージョンが1~40まである。一辺の大きさは、「QRコードのバージョン(1~40)\( \times \)4\( + \)17」
  11. 「エラー訂正レベル」は「L(7%の汚れまで)」「M(15%の汚れまで)」「Q(25%の汚れまで)」「H(30%の汚れまで)」の4種類ある
  12. 「1bit」とは「白・黒」、「1・0」のような2種類の情報を表すことができる能力のことで、文字を増やすと「2bit(4種類)」「3bit(8種類)」と表現できる種類が増える
  13. 日常の言葉を「エンコード」して「コード(符号)」に置き換え、「コード(符号)」を「デコード」して日常の言葉に戻す
  14. QRコードの「エンコード」方式は「数字モード」「英数字モード」「漢字モード」「8bitモード」の4種類
  15. どの「エンコード」方式でも、データは「モード指示子」+「文字数指示子」+「データ」+「終端パターン」+「埋め草ビット」+「埋め草ワード」となる

英数字モード

「英数字モード」はほとんど前回解説した「数字モード」と同じです。

ということで、今回の解説はしゅーりょー!・・・ってわけにはいかないですね。
まず、「英数字モードのデータ構造」ですが「数字モード」の構造とまったく同じです。念のため、もう一度書いておきます。


「モード指示子」+「文字数指示子」+「データ+終端パターン」+「埋め草ビット」+「埋め草ワード」

「モード指示子」は、前回説明したように、「英数字モード」は「0010」ですね。
前回書いたものを再度書いておきますね。
モード モード指示子
数字モード 0001
英数字モード 0010
8bitモード 0100
漢字モード 1000


次に、「英数字モード」の「文字数指示子」についてです。

QRコードのバージョンによって桁数が変わるのでしたね。「英数字モード」の場合の「文字数指示子」の桁数は次の表のとおりです。

バージョン 文字数指示子の桁数
1~9 9
10~26 11
27~40 13

「データ」部分の解説は後回しにするとして、「終端パターン(「0000」)」、「埋め草ビット(データ領域の桁数が8の倍数になるように「0」を入れる)」「埋め草ワード(QRコードのバージョン・エラー訂正レベルで決まる容量を満たすように「11101100」と「00010001」を交互に入れる)」は「数字モード」と全く同じです。

英数字モードのデータ

今回のメインディッシュです。「データ領域」は、さすがに「数字モード」とは全然違います

早速、作り方をステップを追って説明しましょう。
  1. エンコードしたいデータを「2桁ずつ」に区切ります。
  2. 2桁の文字を、それぞれ、決められた表に従って数字に変えます。
  3. 2桁のうち、はじめの文字を数字に置き換えたものを45倍し、2番目の文字を数字に置き換えたものと足します。(不思議ですね)
  4. 足し算した数字を11桁の2進数に変換します。
ただし、エンコードしたいデータの文字数が2の倍数ではなく、2桁ずつに区切った際に最後に1文字余る場合は、その一文字を変換表に従って数字にし、その数字を6桁の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