はじめに
前回までは基礎編ということで、比較的わかりやすくQRコードの符号化。リードソロモン符号の仕組みについて紹介してきました。今回からは深淵編ということで、具体的なエンコード(文字列からQRコードにする)プログラムと、デコード(QRコードを読み取る)でのパリティ方式の理論、バーレカンプ・マッシー法やチェン探索などについて、追っていこうと思います。
理論に入る前に、今回は、QRコードの仕様についてまとめます。
QRコードの仕様まとめ
QRコードでは、左上のファインダパタンの周り、および左下と右上のファインダパタンの側面にそのQRがどのバージョンなのか?どのようなマスクをしているのかについての情報を入れています。
QRコードリーダやQRコードジェネレーターは、指定したバージョンなどをここに入れたり読み解いたりすることで、様々なサイズや形式のQRコードを1つの仕組みで読み取れるように設計されています。

図1 QRコードのバージョン情報の配置
バージョン(サイズ)
QRコードのバージョンのうち主要なものを挙げると以下のようなものがあります。参考:JIS 0510[1]
表1 QRのバージョンとサイズの対応
| バージョン | サイズ(モジュール数) | 数字(桁) | 英数字(文字) | バイナリ・8bit(バイト) | 漢字・Shift-JIS(文字) |
| 1 | 21 × 21 | 41 | 25 | 17 | 10 |
| 2 | 25 × 25 | 77 | 47 | 32 | 20 |
| 5 | 37 × 37 | 308 | 186 | 106 | 65 |
| 10 | 57 × 57 | 861 | 520 | 346 | 213 |
| 20 | 97 × 97 | 3,067 | 1,852 | 1,220 | 758 |
| 40 (最大) | 177 × 177 | 7,089 | 4,296 | 2,953 | 1,817 |
誤り訂正レベル
誤り訂正レベルとは、どれだけ破損していても復元できるか?を表すレベルです。これまで説明してきたリードソロモン符号の誤り訂正用のbyteをどのくらい作るか?という設定を表します。
表2 誤り訂正レベルとリードソロモン符号の割合
| 誤り訂正レベル | レベルの意味 | 復元可能な割合(汚れへの強さ) | 全体に占めるリード・ソロモン符号の割合(目安) |
| L (Low) | データ容量を最優先 | 約 7% | 約 20〜27% |
| M (Medium) | 標準的(最も一般的) | 約 15% | 約 36〜38% |
| Q (Quartile) | 汚れやすい環境向け | 約 25% | 約 50〜55% |
| H (High) | 工場やヘビーユース向け | 約 30% | 約 60〜65% |
マスクパタン
マスクパタンとは、画像処理のマスクと同じように、特定領域を反転させたりするもののことです。QRコードにおけるマスクは全部で7パタンあります。
表3 JIS X 0510で定義された8種類のマスクパタン
| 参照子 (2進数) | マスク番号 | 条件式(数式 / Pythonライクな表記) |
000 | 0 | (r + c) % 2 == 0 |
001 | 1 | r % 2 == 0 |
010 | 2 | c % 3 == 0 |
011 | 3 | (r + c) % 3 == 0 |
100 | 4 | (r // 2 + c // 3) % 2 == 0 ※//は切り捨て除算 |
101 | 5 | (r * c) % 2 + (r * c) % 3 == 0 |
110 | 6 | ((r * c) % 2 + (r * c) % 3) % 2 == 0 |
111 | 7 | ((r + c) % 2 + (r * c) % 3) % 2 == 0 |
引用元:JIS 0510[1]. p49 ,表10−マスクパターン生成条件より作成
数式で見ると難しそうですが、それぞれを画像にしてしまえばわかりやすいです。マスク処理ではこのマスクパタンを用いて白黒を反転させます。

図2 QRコードのマスクパタン
引用元:JIS 0510[1]. p50 ,図21−1型シンボルに対するマスクパターンより引用
まとめ
今回は、QRコードのバージョンや誤り訂正レベル、マスク処理に関する仕様についてまとめました。1つのバージョンだけをとっても、誤り訂正レベル4種とマスクパタン8種で32パターンあり、全40バージョンを合わせると 1,280パターン もの組み合わせが存在します。
これがQRコードが用途を問わず柔軟に使われている最大の理由です。
対象にするバージョン2とレベルQ
これからエンコーダとデコーダを作るにあたり、これらすべてに対応することは困難(かつ、面倒すぎる)なので、アライメントパタンがあり、かつ、ある程度情報量も入れられる、バージョン2の誤り訂正レベルQ。マスクは市松模様(000)をターゲットに作っていこうと思います。
次回からは、いよいよこの仕様をベースにして、文字列をQRコードのデータに変換するエンコーダの作成や、バーレカンプ・マッシー法などの数学的アプローチを用いたデコーダの実装といった「深淵編」へと突入します。段階を追ってコードとともに解説していく予定なので、QRコードを完璧に理解したい方はぜひ読んでみてください。
次回:自作QRコードエンコーダへの道 ガロア体をプログラムする
関連記事は、2026年6月18日に公開予定 (あと11時間)
関連記事
この記事シリーズでは、QRコードの符号化をCRCと比較しながら流れを把握し、QRコードを自作できるところまで開設する予定です。良ければほかの記事も覗いていってみてください。
第1回:CRCと比較してリードソロモン符号の仕組みを大まかに理解する。
QRコードを解読する:エラーはどうやって直る?リード・ソロモン符号の基本 【第1回】
第2回:デジタル世界の数学「ガロア体」を超ざっくり理解しよう!
デジタル世界の数学「ガロア体」を超ざっくり理解しよう!【QRコードを解読する 第2回】
参考文献
1. 日本工業規格 , X 0510:2018 (ISO/IEC 18004:2015) https://kikakurui.com/x0/X0510-2018-01.html