QRコード便利ですよね。普段サクッとスマホで読み取りしているQRコードですが、実は人力でも読むことができます。わかりやすいサイトがなかったので、個人的にまとめることにしました。どこよりも分かりやすくを目指すので、興味がある人はぜひ見て行ってください。
QRコードを目で見て読んでみたいのですけど
どうしたらいいですか?
面白いことを思いつくね
基本的にQRコードは暗号化されていないから
簡単なQRコードだったら、頑張れば読むことができるよ
本当ですか!?
簡単な例で良いので教えてほしいです
じゃあ、例を出すから一緒に順を追って見ていこうか
QRコードとは?
QRコード®は、デンソーウェーブが1994年に開発した2次元コードです。思っていたより昔からあるんですね。
1次元のバーコードより、当然多くの情報を組み込むことができます。
それを利用し、一部が破損しても問題ないほどの情報を入れることができます。
スマホ決済によく使われていますね。PayPay あたりは多くの人が1度は使ったことがあると思います。
QRコードの構成
以下でQRがどう成り立っているかを簡単に説明します。1個1個の小さい点々の領域を「セル」といいます。
ファインダパターン
QRコード自体の位置を把握しやすいようにする領域です。
どの方向からどう見るか?というのが、機械側で誤りがないようにするための固定領域です。
タイミングパターン
黒と白のセルが交互に現れる領域です。
これもQRコード自体の読み取りについて、誤りを少なくするためにある領域です。
フォーマット情報
読み取るための情報が埋め込まれている領域です。
間で2セル分、先程説明したタイミングパターン部分はスキップしています。
データ部分がどのように変換されているかの情報を含みます。今回はこの部分を使用します。
フォーマット情報(予備)
先に説明したフォーマット情報部分の予備です。
先程のフォーマット情報と同じデータが組み込まれています。
矢印に沿って読み取ると、先に説明したフォーマット情報と同じ白黒状態ですね。
クワイエットゾーン
簡単に言えば余白です。4セルほどあける必要があります。
QRコードを目で!いざ読み取り!
それでは、いよいよQRコードを読み取ってみましょう!
読み取るために最低限必要な情報に絞り、ステップ・バイ・ステップで解説していきます。
マスク情報
セルの読み取り
まずはマスク情報を見てみましょう。マスク情報は以下の3セル部分に埋め込まれています。
全部黒塗りですね。つまり、111 となります。
マスク情報を求める
この 111 と (予め決まった値の) 101 の XOR を計算します。そうすると 010 となります。
XOR とは?
排他的論理和と呼ばれています。exclusive or の略語です。お互い同じ(0 同士か 1 同士)であれば 0 、違う場合は 1 になります。
値1 | 値2 | XOR |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
010 と計算できましたね。この 010 とは何なのか?
どの反転パターンか調べる
下記のパターンを参考に、 010 の反転パターンで反転処理をしてくださいという意味になります。
QRコード自体の(ファインダパターンを含めた)一番左上の部分からこの反転パターンを適用します。
なぜこんな面倒なことをするかというと、白塗りや黒塗りが広い部分を回避するためです。適度に白と黒を散らせることにより、読み込みエラーを防ぎます。
今回は 010 です。つまり、下記部分を反転させて解読してくださいということになります。
分かりやすさのために全体を赤くしています。ファインダパターンやフォーマット情報には反転マスクは影響しません。
では続けて読んでいきましょう。
モード判定
まずは下記の赤部分を見てみます。この部分でモード(数字だけか英数字も使うか等々…)がわかります。
モード一覧
モード | 数値 |
---|---|
数字 | 0001 |
英字・記号 | 0010 |
バイナリ(8bit) | 0100 |
漢字 | 1000 |
上記画像の数字、1→2→3→4 の順番で読みます。
そうすると、
白→黒→白→白
となるので、
0100
となります。
つまり、今回は
バイナリ(8bit) モード
が使用されていることがわかります。
文字数判定
次に読む場所は下記赤色の文字数部分です。
数字が書いてある順番に読みます。
白→白→白→白→白→黒→黒→黒
となるので、
00000111
となります。
2進数の 111 は 10進数に直すと 7 です。つまり、このQRコードには
7 文字含まれている
と分かります。
文字の読み取り
文字の読み取りの際に必要な一覧表をここに書いておきます。
※今回最低限必要な英小文字の一覧表です
英小文字 | ASCIIコード (2進数) |
---|---|
a | 01100001 |
b | 01100010 |
c | 01100011 |
d | 01100100 |
e | 01100101 |
f | 01100110 |
g | 01100111 |
h | 01101000 |
i | 01101001 |
j | 01101010 |
k | 01101011 |
l | 01101100 |
m | 01101101 |
n | 01101110 |
o | 01101111 |
p | 01110000 |
q | 01110001 |
r | 01110010 |
s | 01110011 |
t | 01110100 |
u | 01110101 |
v | 01110110 |
w | 01110111 |
x | 01111000 |
y | 01111001 |
z | 01111010 |
1文字目
いざ、実際に文字の読み取りです!
今回1文字は8セルずつ情報が入っているので、1文字目は下記の8セルから読み取ります。
白黒がどうなっているのか見てみましょう。
1白→2黒→3黒→4白→5白→6黒→7白→8白
となります。つまり、
01100100
ですね。これは一覧表から d にあたります。
1文字目は
d
と分かりました。
2文字目
では2文字目です。2文字目も8セル分に情報が詰まっているのですが、フォーマット情報にぶつかってしまいます。そういう場合、そのまま左へ移動し、ターンするように折り返して流して読んでいきます。
さて、純粋に読むと
1白→2黒→3黒→4白→5黒→6白→7黒→8黒
となっています。しかし、5 と 7 の部分は反転する領域の中にあります。
つまり、反転領域を反転させて読んだ
1白→2黒→3黒→4白→5白→6白→7白→8黒
が正解です。
01100001
となります。
一覧表より、2文字目は
a
と分かりました。
3文字目
この先は、これまでと同様に反転部分に気をつけながら読み解いて行くだけです。
まずそのままの色を読んでみます。
1黒→2黒→3白→4黒→5白→6白→7黒→8黒
となります。今回は 1,3,5,7 部分が反転ですね。
ではその部分を反転して
1白→2黒→3黒→4黒→5黒→6白→7白→8黒
が正解です。つまり、
01111001
となり、これは表から
y
と分かりました。
4文字目 ~
4文字目以降も同様に読み解いていくだけですので、割愛します。
実際に読んで1文字目から通して見ると
daylife
と文字データがあることが分かります。
人力QRコード
仕組みさえ分かってしまえば、無理に機械で作成せず、下記のように人の手で書いてそれを読むこともできます。
ただ、当然マスク処理のパターンや、それに伴う反転も考慮して作成しなければいけないので相当手間はかかります。
人力で書いたQRコードを人力で読み取ってる pic.twitter.com/rCytUI7kym
— しゅん🌙 (@shun_shobon) July 8, 2023
まとめ
今回はQRコードの読み方を紹介しました。機械がない状態でQRコードを読み取る必要があることは、そうそう機会はないと思いますが、流行りのものの仕組みを知っておくのは面白いですよね。目でQRコードをを読み取れると言うと、1つの話のタネになるのではないでしょうか。