QRコードの仕組み
QRコードのエンコード・デコードの仕組みを解説する。
関連ページ
- 有限体
- 誤り訂正符号 - BCH符号・RS符号
- QRコードの仕組み (本ページ)
- QRコード生成ツール
目次
QRコードの経緯
QRコード(Quick-Response code)は、1994年にデンソー(現・デンソーウェーブ)が発明した2次元コード。
デンソーの製造現場で、従来のバーコードに代わる大容量かつ読み取り効率の高いコードが求められたことをきっかけに開発された。QRコードには次のような特徴がある。
- 1次元コードであるバーコードに比べて格納できる情報の量が多い
- Finder Patternという独特なパターンを用いることでコードの検出を容易にし、高速な読み取りを実現
- 符号理論に基づいた誤り訂正能力を備え、コードの汚れによる情報欠損に対して堅牢性がある
これらの特長により、QRコードは製造・流通業界に急速に普及した。その後、カメラ付き携帯電話の登場に伴い、スマートフォン決済や電子チケットなど身近な場面でも広く活用されるようになり、現在では日常生活に不可欠な技術となっている。

2012年のパズルゲーム「FEZ」に登場するQRコードを利用した仕掛け
構造
QRコードには初期の仕様であるモデル1と、大型化に対応したモデル2が存在する。現在はモデル1が使用されることは滅多にないので、この投稿ではモデル2に限って解説を行う。
また、データ圧縮方式には「数値モード」・「英数字モード」・「8ビットバイトモード」・「漢字モード」の種類が存在するが、ここでは8ビットバイトモードのみを使う前提で解説する。
UTF-8でエンコードしたバイト列を8ビットバイトモードでQRコードにエンコードすることで、英数字と漢字を含むUnicodeの文字列を自由に表現することができる。
バージョン
QRコードの大きさは後述のQuiet Zone(外側の白い部分)を除いた部分のセルの数で表現される。(セルのことを正式には「モジュール」と言うが、直感的ではないのでここではセルと呼ぶことにする)
最小のQRコードは21x21の大きさで、このサイズをバージョン1(あるいは1型)と呼ぶ。バージョン2は25x25、バージョン3は29x29と、バージョンが1上がるごとに一辺が4セルずつ増えていく。最大のバージョンは40で、サイズは177x177。
バージョン | QRコードの大きさ |
---|---|
1 | 21x21 |
2 | 25x25 |
3 | 29x29 |
4 | 33x33 |
5 | 37x37 |
6 | 41x41 |
7 | 45x45 |
8 | 49x49 |
9 | 53x53 |
10 | 57x57 |
11 | 61x61 |
12 | 65x65 |
13 | 69x69 |
14 | 73x73 |
15 | 77x77 |
16 | 81x81 |
17 | 85x85 |
18 | 89x89 |
19 | 93x93 |
20 | 97x97 |
21 | 101x101 |
22 | 105x105 |
23 | 109x109 |
24 | 113x113 |
25 | 117x117 |
26 | 121x121 |
27 | 125x125 |
28 | 129x129 |
29 | 133x133 |
30 | 137x137 |
31 | 141x141 |
32 | 145x145 |
33 | 149x149 |
34 | 153x153 |
35 | 157x157 |
36 | 161x161 |
37 | 165x165 |
38 | 169x169 |
39 | 173x173 |
40 | 177x177 |

バージョン1のQRコードの例 (21x21)

バージョン40のQRコードの例 (177x177)
構成要素
Quiet Zone (クワイエットゾーン)
Quiet Zoneは、QRコードの外側に存在する余白領域。上下左右それぞれに4セル分確保する必要があると定められている。

Quiet Zone
Finder Pattern (位置検出パターン)
Finder Patternは、QRコードの左上・右上・左下に配置される特徴的なパターン。
このパターンはQRコードの検出のために利用される。読み取り機は1:1:3:1:1の白黒のパターンを検出することによってFinder Patternの位置を特定し、3つのFinder Patternの位置関係からQRコードが存在する領域を推定する。
1:1:3:1:1という比率は、開発当時にあらゆる印刷物を調べて最も使われていない比率であったことから、誤認識が少ないという理由で採用されたらしい。

Finder Pattern
Alignment Pattern (位置合せパターン)
Alignment Patternは、QRコード内にほぼ等間隔に配置されるパターン。
QRコードの歪みを補正するために利用される。
Alignment Patternはバージョン2から6までは2x2個配置し(ただしFinder Patternと被る部分は描画しない)、以降はバージョンが7上がるごとに縦横に1つずつ配置個数を増やしていく。また、バージョン1の場合は例外的にAlignment Patternを1つも配置しない。
バージョン | Alignment Patternの個数 |
---|---|
1 | 0 |
2-6 | 2x2 - 3 = 1 |
7-13 | 3x3 - 3 = 6 |
14-20 | 4x4 - 3 = 13 |
21-27 | 5x5 - 3 = 22 |
28-34 | 6x6 - 3 = 33 |
35-40 | 7x7 - 3 = 46 |
下図はバージョン9の例。3x3の格子状に6個のパターンを配置している。

Alignment Pattern
Alignment Patternは上下左右の端のパターンがFinder Patternと整列するように配置され、その間にほぼ等間隔になるように残りのパターンが配置される。
左右(あるいは上下)の端同士のパターンの中心座標の差を\(a\)とし、Alignment Patternの配置数を\(b\)x\(b\)とすると、Alignment Patternは中心座標の間隔が\(\frac{a}{b-1}\)以上の最小の偶数、つまり\(2\left\lceil \frac{1}{2}\frac{a}{b-1} \right\rceil\)となるように右(下)から配置される。その結果、左端(上端)では間隔が他の部分より短くなる場合がある。
例えば、下図はバージョン16の場合のAlignment Patternの例だが、\(a = 81-13 = 68\)、\(b=4\)なので中心座標の間隔は\(2\left\lceil \frac{1}{2}\frac{a}{b-1} \right\rceil = 2\left\lceil \frac{1}{2}\frac{68}{3} \right\rceil = 24\)となる。68の間隔を右(下)から24ずつ区切ると最後に20余るので、左端(上端)の間隔だけは20になる。

Alignment Pattern (バージョン16)
Timing Pattern (タイミングパターン)
Timing Patternは、Finder Patternを結ぶように白黒を交互に繰り返すパターン。
QRコード内の座標を決定するために利用される。

Timing Pattern
Separator (分離パターン)
Separatorは、Finder Patternとその他の領域を分離する余白。

Separator
常に黒となる部分
図の位置にある1セルは常に黒になるよう定められている。特に名称は定められていない。

常に黒となる部分
Format Information (形式情報)
Format Informationは、後述の誤り訂正レベルとマスクパターンを記録する15-bitの値。
下図のようにSeparatorに隣接する位置に配置され、縦方向と横方向に同一の情報を2箇所に書き込む。(黒=1, 白=0)

Format Information

Format Informationの配置順 (0が下位ビットで14が上位ビット)
Format Informationの内容は次の3つの部分で構成される。詳細は後述。
- 誤り訂正レベル指示子 (2-bit)
- L=01, M=00, Q=11, H=10を書き込む
- マスクパターン参照子 (3-bit)
- マスクパターン0~8をそのまま2進数で書き込む
- 上記合計5-bitに対するBCH符号の誤り訂正ビット (10-bit)
- 生成多項式は10100110111
Version Information (型番情報)
Format Informationはバージョンの情報を記録する領域。この領域はバージョン7以上のQRコードにのみ存在する。
下図のようにSeparatorに隣接する位置に配置され、Format Informationと同様に2箇所に同じ内容を書き込む。

Version Information


Version Informationの配置順 (0が下位ビットで17が上位ビット)
Version Informationの内容は次の2つの部分で構成される。詳細は後述。
- バージョン情報 (6-bit)
- バージョン情報6-bitに対するBCH符号の誤り訂正ビット (12-bit)
- 生成多項式は1111100100101
符号語領域 (データと誤り訂正符号)
これまでに説明した領域を除いた残りの領域全体が「データ」と「誤り訂正符号」を書き込む領域となる。
書き込みたいデータのビット列を8ビットずつのコード語に区切り、コード語の集合を並び替えてからブロックに分割し、ブロックごとにRS符号化し、データコード語と誤り訂正コード語を適切な順番で書き込む。詳しくは後述する。

データと誤り訂正符号
この領域の容量は次の表の通り。
データと誤り訂正符号は8ビット単位の大きさの「コード語」として扱われるので、bit数で表されるコード容量を8で割った余りはデータの保存に使うことはできない。この余りのビット数のことを残余ビットと言う。
また次の表には、仕様で定められたブロック数とブロックごとの誤り訂正コード語数も記載する。
バージョン | 大きさ | コード容量 | 残余 ビット | ブロック数 | ブロックごとの 誤り訂正コード語数 | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
bit | コード語 | L | M | Q | H | L | M | Q | H | |||
1 | 21x21 | 208 | 26 | 0 | 1 | 1 | 1 | 1 | 7 | 10 | 13 | 17 |
2 | 25x25 | 359 | 44 | 7 | 1 | 1 | 1 | 1 | 10 | 16 | 22 | 28 |
3 | 29x29 | 567 | 70 | 7 | 1 | 1 | 2 | 2 | 15 | 26 | 18 | 22 |
4 | 33x33 | 807 | 100 | 7 | 1 | 2 | 2 | 4 | 20 | 18 | 26 | 16 |
5 | 37x37 | 1079 | 134 | 7 | 1 | 2 | 4 | 4 | 26 | 24 | 18 | 22 |
6 | 41x41 | 1383 | 172 | 7 | 2 | 4 | 4 | 4 | 18 | 16 | 24 | 28 |
7 | 45x45 | 1568 | 196 | 0 | 2 | 4 | 6 | 5 | 20 | 18 | 18 | 26 |
8 | 49x49 | 1936 | 242 | 0 | 2 | 4 | 6 | 6 | 24 | 22 | 22 | 26 |
9 | 53x53 | 2336 | 292 | 0 | 2 | 5 | 8 | 8 | 30 | 22 | 20 | 24 |
10 | 57x57 | 2768 | 346 | 0 | 4 | 5 | 8 | 8 | 18 | 26 | 24 | 28 |
11 | 61x61 | 3232 | 404 | 0 | 4 | 5 | 8 | 11 | 20 | 30 | 28 | 24 |
12 | 65x65 | 3728 | 466 | 0 | 4 | 8 | 10 | 11 | 24 | 22 | 26 | 28 |
13 | 69x69 | 4256 | 532 | 0 | 4 | 9 | 12 | 16 | 26 | 22 | 24 | 22 |
14 | 73x73 | 4651 | 581 | 3 | 4 | 9 | 16 | 16 | 30 | 24 | 20 | 24 |
15 | 77x77 | 5243 | 655 | 3 | 6 | 10 | 12 | 18 | 22 | 24 | 30 | 24 |
16 | 81x81 | 5867 | 733 | 3 | 6 | 10 | 17 | 16 | 24 | 28 | 24 | 30 |
17 | 85x85 | 6523 | 815 | 3 | 6 | 11 | 16 | 19 | 28 | 28 | 28 | 28 |
18 | 89x89 | 7211 | 901 | 3 | 6 | 13 | 18 | 21 | 30 | 26 | 28 | 28 |
19 | 93x93 | 7931 | 991 | 3 | 7 | 14 | 21 | 25 | 28 | 26 | 26 | 26 |
20 | 97x97 | 8683 | 1085 | 3 | 8 | 16 | 20 | 25 | 28 | 26 | 30 | 28 |
21 | 101x101 | 9252 | 1156 | 4 | 8 | 17 | 23 | 25 | 28 | 26 | 28 | 30 |
22 | 105x105 | 10068 | 1258 | 4 | 9 | 17 | 23 | 34 | 28 | 28 | 30 | 24 |
23 | 109x109 | 10916 | 1364 | 4 | 9 | 18 | 25 | 30 | 30 | 28 | 30 | 30 |
24 | 113x113 | 11796 | 1474 | 4 | 10 | 20 | 27 | 32 | 30 | 28 | 30 | 30 |
25 | 117x117 | 12708 | 1588 | 4 | 12 | 21 | 29 | 35 | 26 | 28 | 30 | 30 |
26 | 121x121 | 13652 | 1706 | 4 | 12 | 23 | 34 | 37 | 28 | 28 | 28 | 30 |
27 | 125x125 | 14628 | 1828 | 4 | 12 | 25 | 34 | 40 | 30 | 28 | 30 | 30 |
28 | 129x129 | 15371 | 1921 | 3 | 13 | 26 | 35 | 42 | 30 | 28 | 30 | 30 |
29 | 133x133 | 16411 | 2051 | 3 | 14 | 28 | 38 | 45 | 30 | 28 | 30 | 30 |
30 | 137x137 | 17483 | 2185 | 3 | 15 | 29 | 40 | 48 | 30 | 28 | 30 | 30 |
31 | 141x141 | 18587 | 2323 | 3 | 16 | 31 | 43 | 51 | 30 | 28 | 30 | 30 |
32 | 145x145 | 19723 | 2465 | 3 | 17 | 33 | 45 | 54 | 30 | 28 | 30 | 30 |
33 | 149x149 | 20891 | 2611 | 3 | 18 | 35 | 48 | 57 | 30 | 28 | 30 | 30 |
34 | 153x153 | 22091 | 2761 | 3 | 19 | 37 | 51 | 60 | 30 | 28 | 30 | 30 |
35 | 157x157 | 23008 | 2876 | 0 | 19 | 38 | 53 | 63 | 30 | 28 | 30 | 30 |
36 | 161x161 | 24272 | 3034 | 0 | 20 | 40 | 56 | 66 | 30 | 28 | 30 | 30 |
37 | 165x165 | 25568 | 3196 | 0 | 21 | 43 | 59 | 70 | 30 | 28 | 30 | 30 |
38 | 169x169 | 26896 | 3362 | 0 | 22 | 45 | 62 | 74 | 30 | 28 | 30 | 30 |
39 | 173x173 | 28256 | 3532 | 0 | 24 | 47 | 65 | 77 | 30 | 28 | 30 | 30 |
40 | 177x177 | 29648 | 3706 | 0 | 25 | 49 | 68 | 81 | 30 | 28 | 30 | 30 |
容量が最大となるのはバージョン40・誤り訂正レベルLの場合で、(8ビットバイトモードの場合) \(3706-25\times30 - 3 = 2953\) Byteのデータを格納することができる。(差し引いた3 Byte分は、8ビットバイトモードを指定する1Byteとデータの長さを指定する2Byte)
Format/Version Informationのエンコード
Format Information
Format Informationの内容は次の3つの部分で構成される。
- 誤り訂正レベル指示子 (2-bit)
- L=01, M=00, Q=11, H=10を書き込む
- マスクパターン参照子 (3-bit)
- マスクパターン0~8をそのまま2進数で書き込む
- 上記合計5-bitに対するBCH符号の誤り訂正ビット (10-bit)
- 生成多項式は10100110111
誤り訂正レベルとは、QRコードの符号語領域のRS符号化において訂正できる誤りの割合を表すL=Low, M=Medium, Q=Quartile, H=Highの4種類の値。Lowは7%程度の誤りを訂正でき、Hは30%程度の誤りを訂正できる。
詳細は後述。
マスクは、エンコードされたデータのパターンがFinder Patternなどの機能パターンと誤認識されることを防ぐために、データと誤り訂正符号の領域で白と黒を反転させる特定のパターン。8種類のパターンが規定されている。
こちらも詳細は後述。
またこれら3つの部分を結合した後、ビット列が全て0にならないようにマスクパターン101010000010010とのXOR演算を行って最終的なFormat Informationの値とする。
誤り訂正ビットは後述のBCH符号の組織符号化で実装されているが、実際は次の表のように32通りのパターンしかないので、QRコードを生成する際は予め計算した値を参照して書き込めば良い。
組織符号とは、エンコード後の符号の中に元のデータがそのまま現れるような符号のこと。
下の表の場合、符号の先頭5桁は元のデータそのものとなっている。
誤り訂正レベル | マスク | Format Info (マスク前) | Format Info |
---|---|---|---|
L (01) | 0 (000) | 010001111010110 | 111011111000100 |
1 (001) | 010011011100001 | 111001011110011 | |
2 (010) | 010100110111000 | 111110110101010 | |
3 (011) | 010110010001111 | 111100010011101 | |
4 (100) | 011001000111101 | 110011000101111 | |
5 (101) | 011011100001010 | 110001100011000 | |
6 (110) | 011100001010011 | 110110001000001 | |
7 (111) | 011110101100100 | 110100101110110 | |
M (00) | 0 (000) | 000000000000000 | 101010000010010 |
1 (001) | 000010100110111 | 101000100100101 | |
2 (010) | 000101001101110 | 101111001111100 | |
3 (011) | 000111101011001 | 101101101001011 | |
4 (100) | 001000111101011 | 100010111111001 | |
5 (101) | 001010011011100 | 100000011001110 | |
6 (110) | 001101110000101 | 100111110010111 | |
7 (111) | 001111010110010 | 100101010100000 | |
Q (11) | 0 (000) | 110000101001101 | 011010101011111 |
1 (001) | 110010001111010 | 011000001101000 | |
2 (010) | 110101100100011 | 011111100110001 | |
3 (011) | 110111000010100 | 011101000000110 | |
4 (100) | 111000010100110 | 010010010110100 | |
5 (101) | 111010110010001 | 010000110000011 | |
6 (110) | 111101011001000 | 010111011011010 | |
7 (111) | 111111111111111 | 010101111101101 | |
H (10) | 0 (000) | 100001010011011 | 001011010001001 |
1 (001) | 100011110101100 | 001001110111110 | |
2 (010) | 100100011110101 | 001110011100111 | |
3 (011) | 100110111000010 | 001100111010000 | |
4 (100) | 101001101110000 | 000011101100010 | |
5 (101) | 101011001000111 | 000001001010101 | |
6 (110) | 101100100011110 | 000110100001100 | |
7 (111) | 101110000101001 | 000100000111011 |
具体例
誤り訂正レベルが「Q」で、マスクが「5」の場合の例を見てみよう。
誤り訂正レベルQに対応するビット列は11、マスク5に対応するビット列は101なので、エンコードするデータは11101になる。データの各桁を\(\mathbb{F}_2\)係数多項式の各次数の係数と見なすと、データに対応する多項式は
\begin{align} a(x) &= 1\cdot x^4 + 1\cdot x^3 + 1\cdot x^2 + 0\cdot x + 1 \\ &= x^4+x^3+x^2+1 \end{align}
となる。
生成多項式は10100110111なので、同様に多項式で表すと
\begin{align} g(x) &= x^{10}+x^8+x^5+x^4+x^2+x+1 \end{align}
となる。
BCH符号の組織符号化ではこの場合、\(g(x)\)と同じ次数である\(x^{10}\)を\(a(x)\)に掛けて、\(g(x)\)で割った余り\(r(x)\)を求める。
通常の2進数の割り算ではなく\(\mathbb{F}_2\)上の係数に対する演算なので、\(1+1=0\)となることから桁の繰り上がり・繰り下がりが発生しないことに注意して、次のように計算する。
\begin{align} 11011\, \\ 10100110111 \enclose{longdiv}{111010000000000} \\ \underline{10100110111} \phantom{0000}\, \\ 10011101110 \phantom{000}\, \\ \underline{10100110111} \phantom{000}\, \\ 11101100100 \phantom{0}\, \\ \underline{10100110111} \phantom{0}\, \\ 10010100110 \, \\ \underline{10100110111} \, \\ 0110010001 \, \\ \end{align}
計算結果から、余り\(r(x)\)の2進数表示は0110010001であることがわかる。
得られた\(r(x)\)を用いて
\begin{align} w(x):=a(x)x^{10}-r(x) \end{align}
と定義すると\(w(x)\)は\(g(x)\)で割り切ることができ、目的のBCH符号となる。
\(\mathbb{F}_2\)係数では足し算と引き算は同じ結果になるので、\(w(x)=a(x)x^{10}+r(x)\)とも表すことができる。よって、\(w(x)\)を2進数で表す場合、元のデータと\(r(x)\)を繋げて111010110010001とすれば良い。
Format Informationでは最後に101010000010010とのXOR演算を行うので、最終的な値は010000110000011となる。
\begin{align} 111010110010001 \\ \underline{+ \phantom{0} 101010000010010} \\ 010000110000011 \end{align}
Version Information
Version Informationの内容は次の2つの部分で構成される。
- バージョン情報 (6-bit)
- バージョン情報6-bitに対するBCH符号の誤り訂正ビット (12-bit)
- 生成多項式は1111100100101
Format Informationのようなマスク処理(XOR演算)は行わない。
計算済みの誤り訂正符号全体は次の表の通り。
バージョン | Version Information |
---|---|
7 | 000111110010010100 |
8 | 001000010110111100 |
9 | 001001101010011001 |
10 | 001010010011010011 |
11 | 001011101111110110 |
12 | 001100011101100010 |
13 | 001101100001000111 |
14 | 001110011000001101 |
15 | 001111100100101000 |
16 | 010000101101111000 |
17 | 010001010001011101 |
18 | 010010101000010111 |
19 | 010011010100110010 |
20 | 010100100110100110 |
21 | 010101011010000011 |
22 | 010110100011001001 |
23 | 010111011111101100 |
24 | 011000111011000100 |
25 | 011001000111100001 |
26 | 011010111110101011 |
27 | 011011000010001110 |
28 | 011100110000011010 |
29 | 011101001100111111 |
30 | 011110110101110101 |
31 | 011111001001010000 |
32 | 100000100111010101 |
33 | 100001011011110000 |
34 | 100010100010111010 |
35 | 100011011110011111 |
36 | 100100101100001011 |
37 | 100101010000101110 |
38 | 100110101001100100 |
39 | 100111010101000001 |
40 | 101000110001101001 |
計算例はFormat Informationと同様。
データのエンコード
符号語領域に書き込む値のエンコード方法を解説する。
ここではUTF-8でエンコードしたデータを8ビットバイトモードで書き込む場合に限定して考える。
データコード語の構成
QRコードの符号語領域には8-bit単位で値が書き込まれるが、それらの値には「データコード語」・「誤り訂正コード語」の2種類がある。
- 符号語
- データコード語 - 書き込みたいデータの実体が格納されている。符号語領域の前半に書き込む。
- 誤り訂正コード語 - RS符号で実装された誤り訂正符号。符号語領域の後半に書き込む。
データコード語の列は次のように構成される。
- モード指示子
- ここでは「8ビットバイトモード」を指定する4-bit値「0100」(0x4)で固定
- 文字数指示子
- データビット列の長さ(バイト数)を表すビット列
- 8ビットバイトモードでは文字数指示子の長さはバージョン9以下のとき8-bit、バージョン10以上のとき16-bitになる
- データビット列
- QRコードに保存したいデータ (ここでは文字列をUTF-8でエンコードしたビット列)
- 終端パターン
- 4-bit値「0000」(0x0)でデータの末端を表す
- 残り容量が4-bit未満のときは桁数に合わせて短縮することが可能。特に残り容量が丁度0-bitのときは終端パターン自体を省略することが可能。8ビットバイトモードの場合はこの時点での残り容量は必ず4-bit以上となるので、「0000」で固定と考えて良い。
- 埋め草ビット
- ここまでのデータの長さが8の倍数にならないとき、8の倍数になるように埋め草ビット「0」を必要な数だけ追加する。8ビットバイトモードの場合はここまでのデータの長さは必ず8の倍数になるので、埋め草ビットが発生することはない。
- 埋め草コード語
- データ容量に対する残りの部分は「11101100」(0xEC)・「00010001」(0x11)を繰り返して埋める。
例
バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。
バージョン5なので上に掲載した表から、コード語の容量は134。
ブロック数は4で、各ブロックに22個の誤り訂正コード語があるので、データコード語の容量は134 - 4・22 = 46である。
バージョン | 大きさ | コード容量 | 残余 ビット | ブロック数 | ブロックごとの 誤り訂正コード語数 | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
bit | コード語 | L | M | Q | H | L | M | Q | H | |||
5 | 37x37 | 1079 | 134 | 7 | 1 | 2 | 4 | 4 | 26 | 24 | 18 | 22 |
文字列「QRコード」をUTF-8でエンコードすると、16進数で「51 52 E382B3 E383BC E38389」と表される11バイトの値になる。したがって文字数指示子の値は11となるが、今はバージョン3なので11を8桁の2進数で表して00001011(=0x0B)とする。
これらをまとめるとデータコード語は最終的に次の表のように構成され、16進数で「40 B5 15 2E 38 2B 3E 38 3B CE 38 38 90 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC」となる。
累計サイズ | 項目 | データ (16進数) | 備考 |
---|---|---|---|
0.5 | モード指示子 | 4 | 固定値 |
1.5 | 文字数指示子 | 0B | 11(=0xB)バイト |
12.5 | データビット列 | 5 15 2E 38 2B 3E 38 3B CE 38 38 9 | |
13 | 終端パターン | 0 | 固定値 |
46 | 埋め草コード語 | EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC 11 EC |
ブロック分割
データコード語(の配列)が得られたら、次にデータコード語を規定されたブロック数に分割する。
余りが出る場合は、後ろのブロックが1つ多くのコード語を含むように分ける。
例
バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。
この例では前節で確かめたように、データコード語の容量は46である。ブロック数は4なので、46個のデータコード語は次のように11・11・12・12個に分割される。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Block 0 | 40 | B5 | 15 | 2E | 38 | 2B | 3E | 38 | 3B | CE | 38 | |
Block 1 | 38 | 90 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | |
Block 2 | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC |
Block 3 | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC |
RS符号化
各ブロックをRS符号で組織符号化し、規定の長さの誤り訂正コード語を追加する。RS符号化を行うことによって、万が一QRコードの情報に欠損が生じても、欠損した位置を自動的に検出し修正することができるようになる。
QRコードのRS符号化では、\(\mathbb{F}_{2^8}=\mathbb{F}_2[x]/(x^8+x^4+x^3+x^2+1)\)上係数の多項式が用いられる。
\(\mathbb{F}_{2^8}\)の原始元を\(\alpha(x)=x\)とすると、各要素\(y\in\mathbb{F}_{2^8}\)は次の表のように表すことができる。\(\mathbb{F}_{2^8}\)の要素同士の計算は、足し算(=引き算=XOR演算)のときは2進表記を使い、掛け算・割り算には冪乗表記を使うと簡単に結果を求めることができる。
\(y\) | \(y^{-1}\) | ||||
---|---|---|---|---|---|
10進表記 | 2進表記 | 冪乗表記 | 10進表記 | 2進表記 | 冪乗表記 |
0 | 00000000 | ||||
1 | 00000001 | \(\alpha^{0}\) | 1 | 00000001 | \(\alpha^{0}\) |
2 | 00000010 | \(\alpha^{1}\) | 142 | 10001110 | \(\alpha^{254}\) |
3 | 00000011 | \(\alpha^{25}\) | 244 | 11110100 | \(\alpha^{230}\) |
4 | 00000100 | \(\alpha^{2}\) | 71 | 01000111 | \(\alpha^{253}\) |
5 | 00000101 | \(\alpha^{50}\) | 167 | 10100111 | \(\alpha^{205}\) |
6 | 00000110 | \(\alpha^{26}\) | 122 | 01111010 | \(\alpha^{229}\) |
7 | 00000111 | \(\alpha^{198}\) | 186 | 10111010 | \(\alpha^{57}\) |
8 | 00001000 | \(\alpha^{3}\) | 173 | 10101101 | \(\alpha^{252}\) |
9 | 00001001 | \(\alpha^{223}\) | 157 | 10011101 | \(\alpha^{32}\) |
10 | 00001010 | \(\alpha^{51}\) | 221 | 11011101 | \(\alpha^{204}\) |
11 | 00001011 | \(\alpha^{238}\) | 152 | 10011000 | \(\alpha^{17}\) |
12 | 00001100 | \(\alpha^{27}\) | 61 | 00111101 | \(\alpha^{228}\) |
13 | 00001101 | \(\alpha^{104}\) | 170 | 10101010 | \(\alpha^{151}\) |
14 | 00001110 | \(\alpha^{199}\) | 93 | 01011101 | \(\alpha^{56}\) |
15 | 00001111 | \(\alpha^{75}\) | 150 | 10010110 | \(\alpha^{180}\) |
16 | 00010000 | \(\alpha^{4}\) | 216 | 11011000 | \(\alpha^{251}\) |
17 | 00010001 | \(\alpha^{100}\) | 114 | 01110010 | \(\alpha^{155}\) |
18 | 00010010 | \(\alpha^{224}\) | 192 | 11000000 | \(\alpha^{31}\) |
19 | 00010011 | \(\alpha^{14}\) | 88 | 01011000 | \(\alpha^{241}\) |
20 | 00010100 | \(\alpha^{52}\) | 224 | 11100000 | \(\alpha^{203}\) |
21 | 00010101 | \(\alpha^{141}\) | 62 | 00111110 | \(\alpha^{114}\) |
22 | 00010110 | \(\alpha^{239}\) | 76 | 01001100 | \(\alpha^{16}\) |
23 | 00010111 | \(\alpha^{129}\) | 102 | 01100110 | \(\alpha^{126}\) |
24 | 00011000 | \(\alpha^{28}\) | 144 | 10010000 | \(\alpha^{227}\) |
25 | 00011001 | \(\alpha^{193}\) | 222 | 11011110 | \(\alpha^{62}\) |
26 | 00011010 | \(\alpha^{105}\) | 85 | 01010101 | \(\alpha^{150}\) |
27 | 00011011 | \(\alpha^{248}\) | 128 | 10000000 | \(\alpha^{7}\) |
28 | 00011100 | \(\alpha^{200}\) | 160 | 10100000 | \(\alpha^{55}\) |
29 | 00011101 | \(\alpha^{8}\) | 131 | 10000011 | \(\alpha^{247}\) |
30 | 00011110 | \(\alpha^{76}\) | 75 | 01001011 | \(\alpha^{179}\) |
31 | 00011111 | \(\alpha^{113}\) | 42 | 00101010 | \(\alpha^{142}\) |
32 | 00100000 | \(\alpha^{5}\) | 108 | 01101100 | \(\alpha^{250}\) |
33 | 00100001 | \(\alpha^{138}\) | 237 | 11101101 | \(\alpha^{117}\) |
34 | 00100010 | \(\alpha^{101}\) | 57 | 00111001 | \(\alpha^{154}\) |
35 | 00100011 | \(\alpha^{47}\) | 81 | 01010001 | \(\alpha^{208}\) |
36 | 00100100 | \(\alpha^{225}\) | 96 | 01100000 | \(\alpha^{30}\) |
37 | 00100101 | \(\alpha^{36}\) | 86 | 01010110 | \(\alpha^{219}\) |
38 | 00100110 | \(\alpha^{15}\) | 44 | 00101100 | \(\alpha^{240}\) |
39 | 00100111 | \(\alpha^{33}\) | 138 | 10001010 | \(\alpha^{222}\) |
40 | 00101000 | \(\alpha^{53}\) | 112 | 01110000 | \(\alpha^{202}\) |
41 | 00101001 | \(\alpha^{147}\) | 208 | 11010000 | \(\alpha^{108}\) |
42 | 00101010 | \(\alpha^{142}\) | 31 | 00011111 | \(\alpha^{113}\) |
43 | 00101011 | \(\alpha^{218}\) | 74 | 01001010 | \(\alpha^{37}\) |
44 | 00101100 | \(\alpha^{240}\) | 38 | 00100110 | \(\alpha^{15}\) |
45 | 00101101 | \(\alpha^{18}\) | 139 | 10001011 | \(\alpha^{237}\) |
46 | 00101110 | \(\alpha^{130}\) | 51 | 00110011 | \(\alpha^{125}\) |
47 | 00101111 | \(\alpha^{69}\) | 110 | 01101110 | \(\alpha^{186}\) |
48 | 00110000 | \(\alpha^{29}\) | 72 | 01001000 | \(\alpha^{226}\) |
49 | 00110001 | \(\alpha^{181}\) | 137 | 10001001 | \(\alpha^{74}\) |
50 | 00110010 | \(\alpha^{194}\) | 111 | 01101111 | \(\alpha^{61}\) |
51 | 00110011 | \(\alpha^{125}\) | 46 | 00101110 | \(\alpha^{130}\) |
52 | 00110100 | \(\alpha^{106}\) | 164 | 10100100 | \(\alpha^{149}\) |
53 | 00110101 | \(\alpha^{39}\) | 195 | 11000011 | \(\alpha^{216}\) |
54 | 00110110 | \(\alpha^{249}\) | 64 | 01000000 | \(\alpha^{6}\) |
55 | 00110111 | \(\alpha^{185}\) | 94 | 01011110 | \(\alpha^{70}\) |
56 | 00111000 | \(\alpha^{201}\) | 80 | 01010000 | \(\alpha^{54}\) |
57 | 00111001 | \(\alpha^{154}\) | 34 | 00100010 | \(\alpha^{101}\) |
58 | 00111010 | \(\alpha^{9}\) | 207 | 11001111 | \(\alpha^{246}\) |
59 | 00111011 | \(\alpha^{120}\) | 169 | 10101001 | \(\alpha^{135}\) |
60 | 00111100 | \(\alpha^{77}\) | 171 | 10101011 | \(\alpha^{178}\) |
61 | 00111101 | \(\alpha^{228}\) | 12 | 00001100 | \(\alpha^{27}\) |
62 | 00111110 | \(\alpha^{114}\) | 21 | 00010101 | \(\alpha^{141}\) |
63 | 00111111 | \(\alpha^{166}\) | 225 | 11100001 | \(\alpha^{89}\) |
64 | 01000000 | \(\alpha^{6}\) | 54 | 00110110 | \(\alpha^{249}\) |
65 | 01000001 | \(\alpha^{191}\) | 95 | 01011111 | \(\alpha^{64}\) |
66 | 01000010 | \(\alpha^{139}\) | 248 | 11111000 | \(\alpha^{116}\) |
67 | 01000011 | \(\alpha^{98}\) | 213 | 11010101 | \(\alpha^{157}\) |
68 | 01000100 | \(\alpha^{102}\) | 146 | 10010010 | \(\alpha^{153}\) |
69 | 01000101 | \(\alpha^{221}\) | 78 | 01001110 | \(\alpha^{34}\) |
70 | 01000110 | \(\alpha^{48}\) | 166 | 10100110 | \(\alpha^{207}\) |
71 | 01000111 | \(\alpha^{253}\) | 4 | 00000100 | \(\alpha^{2}\) |
72 | 01001000 | \(\alpha^{226}\) | 48 | 00110000 | \(\alpha^{29}\) |
73 | 01001001 | \(\alpha^{152}\) | 136 | 10001000 | \(\alpha^{103}\) |
74 | 01001010 | \(\alpha^{37}\) | 43 | 00101011 | \(\alpha^{218}\) |
75 | 01001011 | \(\alpha^{179}\) | 30 | 00011110 | \(\alpha^{76}\) |
76 | 01001100 | \(\alpha^{16}\) | 22 | 00010110 | \(\alpha^{239}\) |
77 | 01001101 | \(\alpha^{145}\) | 103 | 01100111 | \(\alpha^{110}\) |
78 | 01001110 | \(\alpha^{34}\) | 69 | 01000101 | \(\alpha^{221}\) |
79 | 01001111 | \(\alpha^{136}\) | 147 | 10010011 | \(\alpha^{119}\) |
80 | 01010000 | \(\alpha^{54}\) | 56 | 00111000 | \(\alpha^{201}\) |
81 | 01010001 | \(\alpha^{208}\) | 35 | 00100011 | \(\alpha^{47}\) |
82 | 01010010 | \(\alpha^{148}\) | 104 | 01101000 | \(\alpha^{107}\) |
83 | 01010011 | \(\alpha^{206}\) | 140 | 10001100 | \(\alpha^{49}\) |
84 | 01010100 | \(\alpha^{143}\) | 129 | 10000001 | \(\alpha^{112}\) |
85 | 01010101 | \(\alpha^{150}\) | 26 | 00011010 | \(\alpha^{105}\) |
86 | 01010110 | \(\alpha^{219}\) | 37 | 00100101 | \(\alpha^{36}\) |
87 | 01010111 | \(\alpha^{189}\) | 97 | 01100001 | \(\alpha^{66}\) |
88 | 01011000 | \(\alpha^{241}\) | 19 | 00010011 | \(\alpha^{14}\) |
89 | 01011001 | \(\alpha^{210}\) | 193 | 11000001 | \(\alpha^{45}\) |
90 | 01011010 | \(\alpha^{19}\) | 203 | 11001011 | \(\alpha^{236}\) |
91 | 01011011 | \(\alpha^{92}\) | 99 | 01100011 | \(\alpha^{163}\) |
92 | 01011100 | \(\alpha^{131}\) | 151 | 10010111 | \(\alpha^{124}\) |
93 | 01011101 | \(\alpha^{56}\) | 14 | 00001110 | \(\alpha^{199}\) |
94 | 01011110 | \(\alpha^{70}\) | 55 | 00110111 | \(\alpha^{185}\) |
95 | 01011111 | \(\alpha^{64}\) | 65 | 01000001 | \(\alpha^{191}\) |
96 | 01100000 | \(\alpha^{30}\) | 36 | 00100100 | \(\alpha^{225}\) |
97 | 01100001 | \(\alpha^{66}\) | 87 | 01010111 | \(\alpha^{189}\) |
98 | 01100010 | \(\alpha^{182}\) | 202 | 11001010 | \(\alpha^{73}\) |
99 | 01100011 | \(\alpha^{163}\) | 91 | 01011011 | \(\alpha^{92}\) |
100 | 01100100 | \(\alpha^{195}\) | 185 | 10111001 | \(\alpha^{60}\) |
101 | 01100101 | \(\alpha^{72}\) | 196 | 11000100 | \(\alpha^{183}\) |
102 | 01100110 | \(\alpha^{126}\) | 23 | 00010111 | \(\alpha^{129}\) |
103 | 01100111 | \(\alpha^{110}\) | 77 | 01001101 | \(\alpha^{145}\) |
104 | 01101000 | \(\alpha^{107}\) | 82 | 01010010 | \(\alpha^{148}\) |
105 | 01101001 | \(\alpha^{58}\) | 141 | 10001101 | \(\alpha^{197}\) |
106 | 01101010 | \(\alpha^{40}\) | 239 | 11101111 | \(\alpha^{215}\) |
107 | 01101011 | \(\alpha^{84}\) | 179 | 10110011 | \(\alpha^{171}\) |
108 | 01101100 | \(\alpha^{250}\) | 32 | 00100000 | \(\alpha^{5}\) |
109 | 01101101 | \(\alpha^{133}\) | 236 | 11101100 | \(\alpha^{122}\) |
110 | 01101110 | \(\alpha^{186}\) | 47 | 00101111 | \(\alpha^{69}\) |
111 | 01101111 | \(\alpha^{61}\) | 50 | 00110010 | \(\alpha^{194}\) |
112 | 01110000 | \(\alpha^{202}\) | 40 | 00101000 | \(\alpha^{53}\) |
113 | 01110001 | \(\alpha^{94}\) | 209 | 11010001 | \(\alpha^{161}\) |
114 | 01110010 | \(\alpha^{155}\) | 17 | 00010001 | \(\alpha^{100}\) |
115 | 01110011 | \(\alpha^{159}\) | 217 | 11011001 | \(\alpha^{96}\) |
116 | 01110100 | \(\alpha^{10}\) | 233 | 11101001 | \(\alpha^{245}\) |
117 | 01110101 | \(\alpha^{21}\) | 251 | 11111011 | \(\alpha^{234}\) |
118 | 01110110 | \(\alpha^{121}\) | 218 | 11011010 | \(\alpha^{134}\) |
119 | 01110111 | \(\alpha^{43}\) | 121 | 01111001 | \(\alpha^{212}\) |
120 | 01111000 | \(\alpha^{78}\) | 219 | 11011011 | \(\alpha^{177}\) |
121 | 01111001 | \(\alpha^{212}\) | 119 | 01110111 | \(\alpha^{43}\) |
122 | 01111010 | \(\alpha^{229}\) | 6 | 00000110 | \(\alpha^{26}\) |
123 | 01111011 | \(\alpha^{172}\) | 187 | 10111011 | \(\alpha^{83}\) |
124 | 01111100 | \(\alpha^{115}\) | 132 | 10000100 | \(\alpha^{140}\) |
125 | 01111101 | \(\alpha^{243}\) | 205 | 11001101 | \(\alpha^{12}\) |
126 | 01111110 | \(\alpha^{167}\) | 254 | 11111110 | \(\alpha^{88}\) |
127 | 01111111 | \(\alpha^{87}\) | 252 | 11111100 | \(\alpha^{168}\) |
128 | 10000000 | \(\alpha^{7}\) | 27 | 00011011 | \(\alpha^{248}\) |
129 | 10000001 | \(\alpha^{112}\) | 84 | 01010100 | \(\alpha^{143}\) |
130 | 10000010 | \(\alpha^{192}\) | 161 | 10100001 | \(\alpha^{63}\) |
131 | 10000011 | \(\alpha^{247}\) | 29 | 00011101 | \(\alpha^{8}\) |
132 | 10000100 | \(\alpha^{140}\) | 124 | 01111100 | \(\alpha^{115}\) |
133 | 10000101 | \(\alpha^{128}\) | 204 | 11001100 | \(\alpha^{127}\) |
134 | 10000110 | \(\alpha^{99}\) | 228 | 11100100 | \(\alpha^{156}\) |
135 | 10000111 | \(\alpha^{13}\) | 176 | 10110000 | \(\alpha^{242}\) |
136 | 10001000 | \(\alpha^{103}\) | 73 | 01001001 | \(\alpha^{152}\) |
137 | 10001001 | \(\alpha^{74}\) | 49 | 00110001 | \(\alpha^{181}\) |
138 | 10001010 | \(\alpha^{222}\) | 39 | 00100111 | \(\alpha^{33}\) |
139 | 10001011 | \(\alpha^{237}\) | 45 | 00101101 | \(\alpha^{18}\) |
140 | 10001100 | \(\alpha^{49}\) | 83 | 01010011 | \(\alpha^{206}\) |
141 | 10001101 | \(\alpha^{197}\) | 105 | 01101001 | \(\alpha^{58}\) |
142 | 10001110 | \(\alpha^{254}\) | 2 | 00000010 | \(\alpha^{1}\) |
143 | 10001111 | \(\alpha^{24}\) | 245 | 11110101 | \(\alpha^{231}\) |
144 | 10010000 | \(\alpha^{227}\) | 24 | 00011000 | \(\alpha^{28}\) |
145 | 10010001 | \(\alpha^{165}\) | 223 | 11011111 | \(\alpha^{90}\) |
146 | 10010010 | \(\alpha^{153}\) | 68 | 01000100 | \(\alpha^{102}\) |
147 | 10010011 | \(\alpha^{119}\) | 79 | 01001111 | \(\alpha^{136}\) |
148 | 10010100 | \(\alpha^{38}\) | 155 | 10011011 | \(\alpha^{217}\) |
149 | 10010101 | \(\alpha^{184}\) | 188 | 10111100 | \(\alpha^{71}\) |
150 | 10010110 | \(\alpha^{180}\) | 15 | 00001111 | \(\alpha^{75}\) |
151 | 10010111 | \(\alpha^{124}\) | 92 | 01011100 | \(\alpha^{131}\) |
152 | 10011000 | \(\alpha^{17}\) | 11 | 00001011 | \(\alpha^{238}\) |
153 | 10011001 | \(\alpha^{68}\) | 220 | 11011100 | \(\alpha^{187}\) |
154 | 10011010 | \(\alpha^{146}\) | 189 | 10111101 | \(\alpha^{109}\) |
155 | 10011011 | \(\alpha^{217}\) | 148 | 10010100 | \(\alpha^{38}\) |
156 | 10011100 | \(\alpha^{35}\) | 172 | 10101100 | \(\alpha^{220}\) |
157 | 10011101 | \(\alpha^{32}\) | 9 | 00001001 | \(\alpha^{223}\) |
158 | 10011110 | \(\alpha^{137}\) | 199 | 11000111 | \(\alpha^{118}\) |
159 | 10011111 | \(\alpha^{46}\) | 162 | 10100010 | \(\alpha^{209}\) |
160 | 10100000 | \(\alpha^{55}\) | 28 | 00011100 | \(\alpha^{200}\) |
161 | 10100001 | \(\alpha^{63}\) | 130 | 10000010 | \(\alpha^{192}\) |
162 | 10100010 | \(\alpha^{209}\) | 159 | 10011111 | \(\alpha^{46}\) |
163 | 10100011 | \(\alpha^{91}\) | 198 | 11000110 | \(\alpha^{164}\) |
164 | 10100100 | \(\alpha^{149}\) | 52 | 00110100 | \(\alpha^{106}\) |
165 | 10100101 | \(\alpha^{188}\) | 194 | 11000010 | \(\alpha^{67}\) |
166 | 10100110 | \(\alpha^{207}\) | 70 | 01000110 | \(\alpha^{48}\) |
167 | 10100111 | \(\alpha^{205}\) | 5 | 00000101 | \(\alpha^{50}\) |
168 | 10101000 | \(\alpha^{144}\) | 206 | 11001110 | \(\alpha^{111}\) |
169 | 10101001 | \(\alpha^{135}\) | 59 | 00111011 | \(\alpha^{120}\) |
170 | 10101010 | \(\alpha^{151}\) | 13 | 00001101 | \(\alpha^{104}\) |
171 | 10101011 | \(\alpha^{178}\) | 60 | 00111100 | \(\alpha^{77}\) |
172 | 10101100 | \(\alpha^{220}\) | 156 | 10011100 | \(\alpha^{35}\) |
173 | 10101101 | \(\alpha^{252}\) | 8 | 00001000 | \(\alpha^{3}\) |
174 | 10101110 | \(\alpha^{190}\) | 190 | 10111110 | \(\alpha^{65}\) |
175 | 10101111 | \(\alpha^{97}\) | 183 | 10110111 | \(\alpha^{158}\) |
176 | 10110000 | \(\alpha^{242}\) | 135 | 10000111 | \(\alpha^{13}\) |
177 | 10110001 | \(\alpha^{86}\) | 229 | 11100101 | \(\alpha^{169}\) |
178 | 10110010 | \(\alpha^{211}\) | 238 | 11101110 | \(\alpha^{44}\) |
179 | 10110011 | \(\alpha^{171}\) | 107 | 01101011 | \(\alpha^{84}\) |
180 | 10110100 | \(\alpha^{20}\) | 235 | 11101011 | \(\alpha^{235}\) |
181 | 10110101 | \(\alpha^{42}\) | 242 | 11110010 | \(\alpha^{213}\) |
182 | 10110110 | \(\alpha^{93}\) | 191 | 10111111 | \(\alpha^{162}\) |
183 | 10110111 | \(\alpha^{158}\) | 175 | 10101111 | \(\alpha^{97}\) |
184 | 10111000 | \(\alpha^{132}\) | 197 | 11000101 | \(\alpha^{123}\) |
185 | 10111001 | \(\alpha^{60}\) | 100 | 01100100 | \(\alpha^{195}\) |
186 | 10111010 | \(\alpha^{57}\) | 7 | 00000111 | \(\alpha^{198}\) |
187 | 10111011 | \(\alpha^{83}\) | 123 | 01111011 | \(\alpha^{172}\) |
188 | 10111100 | \(\alpha^{71}\) | 149 | 10010101 | \(\alpha^{184}\) |
189 | 10111101 | \(\alpha^{109}\) | 154 | 10011010 | \(\alpha^{146}\) |
190 | 10111110 | \(\alpha^{65}\) | 174 | 10101110 | \(\alpha^{190}\) |
191 | 10111111 | \(\alpha^{162}\) | 182 | 10110110 | \(\alpha^{93}\) |
192 | 11000000 | \(\alpha^{31}\) | 18 | 00010010 | \(\alpha^{224}\) |
193 | 11000001 | \(\alpha^{45}\) | 89 | 01011001 | \(\alpha^{210}\) |
194 | 11000010 | \(\alpha^{67}\) | 165 | 10100101 | \(\alpha^{188}\) |
195 | 11000011 | \(\alpha^{216}\) | 53 | 00110101 | \(\alpha^{39}\) |
196 | 11000100 | \(\alpha^{183}\) | 101 | 01100101 | \(\alpha^{72}\) |
197 | 11000101 | \(\alpha^{123}\) | 184 | 10111000 | \(\alpha^{132}\) |
198 | 11000110 | \(\alpha^{164}\) | 163 | 10100011 | \(\alpha^{91}\) |
199 | 11000111 | \(\alpha^{118}\) | 158 | 10011110 | \(\alpha^{137}\) |
200 | 11001000 | \(\alpha^{196}\) | 210 | 11010010 | \(\alpha^{59}\) |
201 | 11001001 | \(\alpha^{23}\) | 247 | 11110111 | \(\alpha^{232}\) |
202 | 11001010 | \(\alpha^{73}\) | 98 | 01100010 | \(\alpha^{182}\) |
203 | 11001011 | \(\alpha^{236}\) | 90 | 01011010 | \(\alpha^{19}\) |
204 | 11001100 | \(\alpha^{127}\) | 133 | 10000101 | \(\alpha^{128}\) |
205 | 11001101 | \(\alpha^{12}\) | 125 | 01111101 | \(\alpha^{243}\) |
206 | 11001110 | \(\alpha^{111}\) | 168 | 10101000 | \(\alpha^{144}\) |
207 | 11001111 | \(\alpha^{246}\) | 58 | 00111010 | \(\alpha^{9}\) |
208 | 11010000 | \(\alpha^{108}\) | 41 | 00101001 | \(\alpha^{147}\) |
209 | 11010001 | \(\alpha^{161}\) | 113 | 01110001 | \(\alpha^{94}\) |
210 | 11010010 | \(\alpha^{59}\) | 200 | 11001000 | \(\alpha^{196}\) |
211 | 11010011 | \(\alpha^{82}\) | 246 | 11110110 | \(\alpha^{173}\) |
212 | 11010100 | \(\alpha^{41}\) | 249 | 11111001 | \(\alpha^{214}\) |
213 | 11010101 | \(\alpha^{157}\) | 67 | 01000011 | \(\alpha^{98}\) |
214 | 11010110 | \(\alpha^{85}\) | 215 | 11010111 | \(\alpha^{170}\) |
215 | 11010111 | \(\alpha^{170}\) | 214 | 11010110 | \(\alpha^{85}\) |
216 | 11011000 | \(\alpha^{251}\) | 16 | 00010000 | \(\alpha^{4}\) |
217 | 11011001 | \(\alpha^{96}\) | 115 | 01110011 | \(\alpha^{159}\) |
218 | 11011010 | \(\alpha^{134}\) | 118 | 01110110 | \(\alpha^{121}\) |
219 | 11011011 | \(\alpha^{177}\) | 120 | 01111000 | \(\alpha^{78}\) |
220 | 11011100 | \(\alpha^{187}\) | 153 | 10011001 | \(\alpha^{68}\) |
221 | 11011101 | \(\alpha^{204}\) | 10 | 00001010 | \(\alpha^{51}\) |
222 | 11011110 | \(\alpha^{62}\) | 25 | 00011001 | \(\alpha^{193}\) |
223 | 11011111 | \(\alpha^{90}\) | 145 | 10010001 | \(\alpha^{165}\) |
224 | 11100000 | \(\alpha^{203}\) | 20 | 00010100 | \(\alpha^{52}\) |
225 | 11100001 | \(\alpha^{89}\) | 63 | 00111111 | \(\alpha^{166}\) |
226 | 11100010 | \(\alpha^{95}\) | 230 | 11100110 | \(\alpha^{160}\) |
227 | 11100011 | \(\alpha^{176}\) | 240 | 11110000 | \(\alpha^{79}\) |
228 | 11100100 | \(\alpha^{156}\) | 134 | 10000110 | \(\alpha^{99}\) |
229 | 11100101 | \(\alpha^{169}\) | 177 | 10110001 | \(\alpha^{86}\) |
230 | 11100110 | \(\alpha^{160}\) | 226 | 11100010 | \(\alpha^{95}\) |
231 | 11100111 | \(\alpha^{81}\) | 241 | 11110001 | \(\alpha^{174}\) |
232 | 11101000 | \(\alpha^{11}\) | 250 | 11111010 | \(\alpha^{244}\) |
233 | 11101001 | \(\alpha^{245}\) | 116 | 01110100 | \(\alpha^{10}\) |
234 | 11101010 | \(\alpha^{22}\) | 243 | 11110011 | \(\alpha^{233}\) |
235 | 11101011 | \(\alpha^{235}\) | 180 | 10110100 | \(\alpha^{20}\) |
236 | 11101100 | \(\alpha^{122}\) | 109 | 01101101 | \(\alpha^{133}\) |
237 | 11101101 | \(\alpha^{117}\) | 33 | 00100001 | \(\alpha^{138}\) |
238 | 11101110 | \(\alpha^{44}\) | 178 | 10110010 | \(\alpha^{211}\) |
239 | 11101111 | \(\alpha^{215}\) | 106 | 01101010 | \(\alpha^{40}\) |
240 | 11110000 | \(\alpha^{79}\) | 227 | 11100011 | \(\alpha^{176}\) |
241 | 11110001 | \(\alpha^{174}\) | 231 | 11100111 | \(\alpha^{81}\) |
242 | 11110010 | \(\alpha^{213}\) | 181 | 10110101 | \(\alpha^{42}\) |
243 | 11110011 | \(\alpha^{233}\) | 234 | 11101010 | \(\alpha^{22}\) |
244 | 11110100 | \(\alpha^{230}\) | 3 | 00000011 | \(\alpha^{25}\) |
245 | 11110101 | \(\alpha^{231}\) | 143 | 10001111 | \(\alpha^{24}\) |
246 | 11110110 | \(\alpha^{173}\) | 211 | 11010011 | \(\alpha^{82}\) |
247 | 11110111 | \(\alpha^{232}\) | 201 | 11001001 | \(\alpha^{23}\) |
248 | 11111000 | \(\alpha^{116}\) | 66 | 01000010 | \(\alpha^{139}\) |
249 | 11111001 | \(\alpha^{214}\) | 212 | 11010100 | \(\alpha^{41}\) |
250 | 11111010 | \(\alpha^{244}\) | 232 | 11101000 | \(\alpha^{11}\) |
251 | 11111011 | \(\alpha^{234}\) | 117 | 01110101 | \(\alpha^{21}\) |
252 | 11111100 | \(\alpha^{168}\) | 127 | 01111111 | \(\alpha^{87}\) |
253 | 11111101 | \(\alpha^{80}\) | 255 | 11111111 | \(\alpha^{175}\) |
254 | 11111110 | \(\alpha^{88}\) | 126 | 01111110 | \(\alpha^{167}\) |
255 | 11111111 | \(\alpha^{175}\) | 253 | 11111101 | \(\alpha^{80}\) |
ブロックごとの誤り訂正コード語数が\(h\)のとき、生成多項式は
\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)\cdots (y-\alpha^{h-1}) \end{align}
と定義される。(このとき\(\left\lfloor\frac{h}{2}\right\rfloor\)個までの符号語に誤りが発生しても訂正することができる)
BCH符号と同様に、(ブロック分割された)データコード語\(a(y)\)に\(y^h\)を掛けて\(g(y)\)で割った余り\(r(y)\)を用いることで、RS符号\(w(y):=a(y)y^h+r(y)\)が得られる。
このとき、\(r(y)\)の係数を羅列したものが(ブロックごとの)誤り訂正コード語となる。
例1
最も単純な例として、バージョン1・誤り訂正レベルLで、データが文字列「QRコード」の場合を考える。
(ブロックごとの)誤り訂正コード語数は7なので、生成多項式は
\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)(y-\alpha^3)(y-\alpha^4)(y-\alpha^5)(y-\alpha^6) \\ \end{align}
となる。この式は、上記の表を参照して例えば
\begin{align} (y-\alpha^5)(y-\alpha^6) &= (y+\alpha^5)(y+\alpha^6) \\ &= y^2 + (\alpha^5 + \alpha^6)y + \alpha^5\alpha^6 \\ &= y^2 + (00100000 \:\mathrm{XOR}\: 01000000)y + \alpha^{11} \\ &= y^2 + 01100000\cdot y + \alpha^{11} \\ &= y^2 + \alpha^{30}y + \alpha^{11} \\ \end{align}
という風に展開していくことができ、最終的に
\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)(y-\alpha^3)(y-\alpha^4)(y-\alpha^5)(y-\alpha^6) \\ &= y^7 + \alpha^{87}y^6 + \alpha^{229}y^5 + \alpha^{146}y^4 + \alpha^{149}y^3 + \alpha^{238}y^2 + \alpha^{102}y + \alpha^{21} \\ &= y^7 + 127y^6 + 122y^5 + 154y^4 + 164y^3 + 11y^2 + 68y + 117 \\ \end{align}
と表すことができる。
データは「40 B5 15 2E 38 2B 3E 38 3B CE 38 38 90 EC 11 EC 11 EC 11」の19コード語となり、多項式で表すと次の通り。
\begin{align} a(y) &= \mathrm{0x40}y^{18} + \mathrm{0xB5}y^{17} + \mathrm{0x15}y^{16} + \mathrm{0x2E}y^{15} + \mathrm{0x38}y^{14} + \mathrm{0x2B}y^{13} + \mathrm{0x3E}y^{12} + \mathrm{0x38}y^{11} + \mathrm{0x3B}y^{10} + \mathrm{0xCE}y^9 + \mathrm{0x38}y^8 + \mathrm{0x38}y^7 + \mathrm{0x90}y^6 + \mathrm{0xEC}y^5 + \mathrm{0x11}y^4 + \mathrm{0xEC}y^3 + \mathrm{0x11}y^2 + \mathrm{0xEC}y + \mathrm{0x11} \\ &= 64y^{18} + 181y^{17} + 21y^{16} + 46y^{15} + 56y^{14} + 43y^{13} + 62y^{12} + 56y^{11} + 59y^{10} + 206y^9 + 56y^8 + 56y^7 + 144y^6 + 236y^5 + 17y^4 + 236y^3 + 17y^2 + 236y + 17 \\ \end{align}
したがって、\(r(y)\)は次のように求めることができる。(\(\mathbb{F}_{2^8}\)上の掛け算・引き算であることに注意)
\begin{align} 64\,\phantom{00}3\,127\,\phantom{0}24\,234\,106\,221\,183\,132\,141\,\phantom{0}43\,219\,232\,218\,\phantom{0}13\,\phantom{0}19\,221\,111\,188\, \\ 1\,127\,122\,154\,164\,\phantom{0}11\,\phantom{0}68\,117 \enclose{longdiv}{\phantom{0}64\,181\,\phantom{0}21\,\phantom{0}46\,\phantom{0}56\,\phantom{0}43\,\phantom{0}62\,\phantom{0}56\,\phantom{0}59\,206\,\phantom{0}56\,\phantom{0}56\,144\,236\,\phantom{0}17\,236\,\phantom{0}17\,236\,\phantom{0}17\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0\,\phantom{00}0} \\ \underline{\phantom{0}64\,182\,235\,\phantom{0}73\,114\,250\,208\,\phantom{0}12} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \phantom{000\,00}3\,254\,103\,\phantom{0}74\,209\,238\,\phantom{0}52\,\phantom{0}59 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{3\,129\,142\,179\,241\,\phantom{0}29\,204\,159} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 127\,233\,249\,\phantom{0}32\,243\,248\,164\,206 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{127\,241\,111\,243\,203\,\phantom{0}94\,\phantom{0}87\,208} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 24\,150\,211\,\phantom{0}56\,166\,243\,\phantom{0}30\,\phantom{0}56 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{24\,124\,\phantom{00}4\,241\,219\,232\,\phantom{0}46\,140} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 234\,215\,201\,125\,\phantom{0}27\,\phantom{0}48\,180\,\phantom{0}56 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{234\,189\,216\,252\,179\,\phantom{0}32\,151\,119} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 106\,\phantom{0}17\,129\,168\,\phantom{0}16\,\phantom{0}35\,\phantom{0}79\,144 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{106\,204\,\phantom{0}19\,110\,\phantom{0}87\,201\,\phantom{0}42\,111} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 221\,146\,198\,\phantom{0}71\,234\,101\,255\,236 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{221\,\phantom{0}37\,171\,226\,\phantom{0}67\,220\,\phantom{0}10\,\phantom{0}36} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 183\,109\,165\,169\,185\,245\,200\,\phantom{0}17 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{183\,233\,184\,140\,\phantom{0}20\,\phantom{0}21\,\phantom{0}32\,\phantom{0}75} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 132\,\phantom{0}29\,\phantom{0}37\,173\,224\,232\,\phantom{0}90\,236 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{132\,144\,\phantom{0}62\,192\,\phantom{0}78\,197\,176\,209} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 141\,\phantom{0}27\,109\,174\,\phantom{0}45\,234\,\phantom{0}61\,\phantom{0}17 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{141\,\phantom{0}48\,179\,254\,163\,150\,238\,\phantom{0}43} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 43\,222\,\phantom{0}80\,142\,124\,211\,\phantom{0}58\,236 \phantom{\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{43\,\phantom{00}5\,130\,189\,129\,\phantom{0}56\,190\,\phantom{0}22} \phantom{\,000\,000\,000\,000\,000\,000\,000\,000}\, \\ 219\,210\,\phantom{0}51\,253\,235\,132\,250\,\phantom{0}17 \phantom{\,000\,000\,000\,000\,000\,000\,000}\, \\ \underline{219\,\phantom{0}58\,170\,153\,188\,230\,143\,\phantom{00}7} \phantom{\,000\,000\,000\,000\,000\,000\,000}\, \\ 232\,153\,100\,\phantom{0}87\,\phantom{0}98\,117\,\phantom{0}22\,\phantom{00}0\phantom{\,000\,000\,000\,000\,000\,000}\, \\ \underline{232\,\phantom{0}67\,\phantom{0}44\,213\,230\,\phantom{0}54\,\phantom{0}31\,157} \phantom{\,000\,000\,000\,000\,000\,000}\, \\ 218\,\phantom{0}72\,130\,132\,\phantom{0}67\,\phantom{00}9\,157\,\phantom{00}0\phantom{\,000\,000\,000\,000\,000}\, \\ \underline{218\,\phantom{0}69\,208\,\phantom{00}3\,\phantom{0}24\,237\,203\,114} \phantom{\,000\,000\,000\,000\,000}\, \\ 13\,\phantom{0}82\,135\,\phantom{0}91\,228\,\phantom{0}86\,114\,\phantom{00}0\phantom{\,000\,000\,000\,000}\, \\ \underline{13\,\phantom{0}65\,120\,108\,\phantom{0}71\,127\,\phantom{0}83\,\phantom{0}51} \phantom{\,000\,000\,000\,000}\, \\ 19\,255\,\phantom{0}55\,163\,\phantom{0}41\,\phantom{0}33\,\phantom{0}51\,\phantom{00}0\phantom{\,000\,000\,000}\, \\ \underline{19\,\phantom{0}34\,125\,230\,\phantom{0}99\,173\,248\,156} \phantom{\,000\,000\,000}\, \\ 221\,\phantom{0}74\,\phantom{0}69\,\phantom{0}74\,140\,203\,156\,\phantom{00}0\phantom{\,000\,000}\, \\ \underline{221\,\phantom{0}37\,171\,226\,\phantom{0}67\,220\,\phantom{0}10\,\phantom{0}36} \phantom{\,000\,000}\, \\ 111\,238\,168\,207\,\phantom{0}23\,150\,\phantom{0}36\,\phantom{00}0\phantom{\,000}\, \\ \underline{111\,\phantom{0}82\,156\,166\,\phantom{0}89\,238\,\phantom{0}99\,211} \phantom{\,000}\, \\ 188\,\phantom{0}52\,105\,\phantom{0}78\,120\,\phantom{0}71\,211\,\phantom{00}0 \, \\ \underline{188\,183\,193\,155\,172\,\phantom{0}80\,246\,\phantom{0}91} \, \\ 131\,168\,213\,212\,\phantom{0}23\,\phantom{0}37\,\phantom{0}91 \, \\ \end{align}
\(r(y)\)の係数を羅列したものが誤り訂正コード語であり、16進表記で表すと「83 A8 D5 D4 17 25 5B」となる。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Block 0 | 40 | B5 | 15 | 2E | 38 | 2B | 3E | 38 | 3B | CE | 38 | 38 | 90 | EC | 11 | EC | 11 | EC | 11 | 83 | A8 | D5 | D4 | 17 | 25 | 5B |
例2
バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。
ブロックごとの誤り訂正コード語数は22なので、生成多項式は
\begin{align} g(y) &= (y-\alpha^0)(y-\alpha^1)(y-\alpha^2)\cdots (y-\alpha^{21}) \\ &= y^{22} + \alpha^{210}y^{21} + \alpha^{171}y^{20} + \alpha^{247}y^{19} + \alpha^{242}y^{18} + \alpha^{93}y^{17} + \alpha^{230}y^{16} + \alpha^{14}y^{15} + \alpha^{109}y^{14} + \alpha^{221}y^{13} + \alpha^{53}y^{12} + \alpha^{200}y^{11} + \alpha^{74}y^{10} + \alpha^{8}y^9 + \alpha^{172}y^8 + \alpha^{98}y^7 + \alpha^{80}y^6 + \alpha^{219}y^5 + \alpha^{134}y^4 + \alpha^{160}y^3 + \alpha^{105}y^2 + \alpha^{165}y + \alpha^{231} \\ &= y^{22} + 89y^{21} + 179y^{20} + 131y^{19} + 176y^{18} + 182y^{17} + 244y^{16} + 19y^{15} + 189y^{14} + 69y^{13} + 40y^{12} + 28y^{11} + 137y^{10} + 29y^9 + 123y^8 + 67y^7 + 253y^6 + 86y^5 + 218y^4 + 230y^3 + 26y^2 + 145y + 245 \\ \end{align}
となる。
前節の例からデータコード語は4つに分割され、それぞれ誤り訂正コード語は次の表のようになる。(計算過程は省略)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Block 0 | 40 | B5 | 15 | 2E | 38 | 2B | 3E | 38 | 3B | CE | 38 | 31 | BC | E3 | E0 | 14 | 2E | E8 | 7E | C2 | E8 | 33 | 57 | 53 | 42 | AA | F1 | 03 | 75 | ED | 86 | 05 | 28 | |
Block 1 | 38 | 90 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 69 | E6 | 05 | 8B | CA | 70 | 3F | 46 | 1A | 9D | E1 | 66 | 39 | 07 | 7F | C8 | 4B | A1 | BA | 77 | 68 | 40 | |
Block 2 | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 17 | 73 | 44 | F5 | 7D | 42 | CB | EB | 55 | 58 | AE | B2 | E5 | B5 | 76 | 94 | 2C | AF | D5 | F3 | 1B | D7 |
Block 3 | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 11 | EC | 17 | 73 | 44 | F5 | 7D | 42 | CB | EB | 55 | 58 | AE | B2 | E5 | B5 | 76 | 94 | 2C | AF | D5 | F3 | 1B | D7 |
コード語の配置
これまでの手順で得られたデータコード語と誤り訂正コード語をQRコードに配置する。
データコード語と誤り訂正コード語に次のように番号を振る。(バージョン5・誤り訂正レベルHの例)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Block 0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | D11 | E1 | E2 | E3 | E4 | E5 | E6 | E7 | E8 | E9 | E10 | E11 | E12 | E13 | E14 | E15 | E16 | E17 | E18 | E19 | E20 | E21 | E22 | |
Block 1 | D12 | D13 | D14 | D15 | D16 | D17 | D18 | D19 | D20 | D21 | D22 | E23 | E24 | E25 | E26 | E27 | E28 | E29 | E30 | E31 | E32 | E33 | E34 | E35 | E36 | E37 | E38 | E39 | E40 | E41 | E42 | E43 | E44 | |
Block 2 | D23 | D24 | D25 | D26 | D27 | D28 | D29 | D30 | D31 | D32 | D33 | D34 | E45 | E46 | E47 | E48 | E49 | E50 | E51 | E52 | E53 | E54 | E55 | E56 | E57 | E58 | E59 | E60 | E61 | E62 | E63 | E64 | E65 | E66 |
Block 3 | D35 | D36 | D37 | D38 | D39 | D40 | D41 | D42 | D43 | D44 | D45 | D46 | E67 | E68 | E69 | E70 | E71 | E72 | E73 | E74 | E75 | E76 | E77 | E78 | E79 | E80 | E81 | E82 | E83 | E84 | E85 | E86 | E87 | E88 |
このとき、これらのデータコード語を「D1 D12 D23 D35 D2 D13 … D33 D45 D34 D46 E1 E23 … E66 E88」というように縦方向に取り出して並び替える。
こうして得られたコード語の列を、下図のように右下からジグザグに1ビットずつ配置していく。
また、最後に残余ビットが生じた場合は0で埋める。下図では「R」と書かれた左下の領域が残余ビットにあたる。

コード語の配置順 (バージョン5・誤り訂正レベルH)

コード語の配置順 (バージョン5・誤り訂正レベルH, ビット単位)
例
バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の場合、並び替えたコード語は「40 38 11 11…」で、ビット列で表すと「01000000 00111000 00010001 00010001…」となる。上記の順序でジグザグに書き込むと下図のようになる。

マスク前のQRコード (バージョン5・誤り訂正レベルH)
マスク
QRコードの白セル・黒セルの個数のバランスを調整し、更にFinder Patternとの誤認識を防ぐため、符号語領域の白黒を特定パターンで反転させる操作を行う。この操作をマスク処理と言う。
マスクパターンは8種類定められている。左上を\((i,j)=(0,0)\)とした\(i\)行\(j\)列のセル座標に対して、次の条件を満たす座標のセルが反転される。(「/」は余りを切り捨てる割り算を意味し、「%」は剰余演算を意味する)
マスクパターン | 条件 | 備考 |
---|---|---|
0 | (i+j)%2 = 0 | |
1 | i%2 = 0 | |
2 | j%3 = 0 | |
3 | (i+j)%3 = 0 | |
4 | ((i/2)+(j/3))%2 = 0 | |
5 | (i*j)%2 + (i*j)%3 = 0 | (i*j)%6 = 0 と同義 |
6 | ((i*j)%2 + (i*j)%3)%2 = 0 | (i*j)%6 < 3 と同義 |
7 | ((i*j)%3 + (i+j)%2)%2 = 0 | ((i*j)%3 + i + j)%2 = 0 と同義 |








12x12のマスクパターン (黒が反転させる位置を表す)
8種類のマスクから最適なマスクを選定するため、次のように各マスクのペナルティを計算する。マスク前のQRコードに8種類のマスクをそれぞれ適用し、次の表の4項目に基づいて合計値を計算する。
8種類の内でペナルティが最小のQRコードが最終的なQRコードになる。(ペナルティ最小ではないQRコードも多くの機器では読み取ることは可能)
項目 | 条件 | 1個ごとのペナルティ |
---|---|---|
1 | 同じ色のセルが5個以上縦か横に連続する | (連続する個数)-2 |
2 | 同じ色のセルの2x2の塊が存在 | 3 |
3 | 縦か横の黒:白:黒:白:黒=1:1:3:1:1のパターンの前後に4つ以上の白が続く | 40 |
4 | 黒セルと白セルの個数の割合に差がある | 10×⌈|黒セル割合-0.5|×20-1⌉ |
- 1に関して
例えば7連続する黒セルが存在するときにその中に含まれる5連続・6連続の黒セルに対して重複してペナルティを課すことはしない。 - 4に関して
[45%, 55%]のときに0点、[40%, 45%)∪(55%, 60%]のときに10点、…という風にペナルティを課す。
例
バージョン5・誤り訂正レベルHで、データが文字列「QRコード」の例を考える。

マスク前のQRコードの例
灰色の部分は未確定のFormat Information








マスクをそれぞれ適用した結果
それぞれのペナルティは次の表の通りなので、ペナルティの最も小さいマスク5が最終的な出力となる。
マスク | ペナルティ1 | ペナルティ2 | ペナルティ3 | ペナルティ4 | 合計 |
---|---|---|---|---|---|
0 | 396 | 420 | 200 | 0 | 1016 |
1 | 378 | 414 | 240 | 0 | 1032 |
2 | 467 | 423 | 80 | 0 | 970 |
3 | 391 | 438 | 120 | 0 | 949 |
4 | 390 | 423 | 200 | 0 | 1013 |
5 | 399 | 426 | 80 | 0 | 905 |
6 | 412 | 483 | 200 | 0 | 1095 |
7 | 379 | 423 | 160 | 0 | 962 |

ペナルティが最小のQRコード (バージョン5・誤り訂正レベルH)
参考
解説
- QRコード Deep Dive ーデータ符号化とか誤り訂正とかー #OpenCV - Qiita
- QRコードをつくってみる その1
- 【QRコードの仕組み】誰でもわかる、簡単QRコードの仕様書・作り方・生成・変換方法・仕組みホームページ(HowToMakeQRCode)
- QRコードを極める|独極|独りで基礎から絶対わかる!
- 分かると、実に、おもしろい! QRコードの仕組み | コリス
- 真心のこもった手づくりQRコードの作り方(本編) - marich1224 のメモ
- JavaScriptで実装してみるQRコードジェネレータ #QRcode - Qiita
- QR code - Wikipedia