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~99
10~2611
27~4013

「データ」部分の解説は後回しにするとして、「終端パターン(「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進数で必要な桁数も少なくなりますよね。このような方法をとると桁数の節約ができるんです。


次は、「英数字モード」の実例を解説しますよん。

今回の解説の最後に、「英数字モード」の「文字と数字の変換表」を書いておきます。
文字変換数字
00
11
22
33
44
55
66
77
88
99
A10
B11
C12
D13
E14
F15
G16
H17
I18
J19
K20
L21
M22
N23
O24
P25
Q26
R27
S28
T29
U30
V31
W32
X33
Y34
Z35
(半角スペース)36
$37
%38
*39
+40
-41
.42
/43
:44