奥深いバーコードの仕組み
バーコードとは
縞模様の線の太さによって数値を表すシンボルのことで、1次元コードとも呼ばれます。
バーコード自体は世界共通の規格ですが、特に日本で使われているバーコードはJANコードと呼ばれています。[1]
JANコードの例
JANコード
標準タイプは13桁、短縮タイプは8桁で構成されています。
更に標準タイプは事業者コードが7桁と9桁のものに分けられ、7桁の場合は商品コードは5桁に、9桁の場合は商品コードは3桁になります。
標準タイプ、短縮タイプ共に先頭の2桁が国コード(日本では47か49)、最後の1桁はチェックデジットとなっています。
バーコード講座より
JANコードの構成
バーコード講座より
JANコードは01のbitで表されます。0が白で1が黒です。
また構成要素としてガードバー、データキャラクタ、チェックデジットがあります。
それぞれ解説していきます。
ガードバー
バーコードの線で少し下にはみ出しているものがガードバーと呼ばれるものです。
これはバーコードの始まり・終わりと真ん中を示すものです。
それぞれ101、01010、101で表されます。
データキャラクタ
標準タイプではセンターバーの左に6桁、右に5桁分の文字が格納されています。
数値はそれぞれ以下の表の通りに変換されます。
偶数パリティと奇数パリティ[2]は1桁目を決定する際に考慮します。
数値 | 左奇数パリティ | 左偶数パリティ | 右偶数パリティ |
---|---|---|---|
0 | 0001101 | 0100111 | 1110010 |
1 | 0011001 | 0110011 | 1100110 |
2 | 0010011 | 0011011 | 1101100 |
3 | 0111101 | 0100001 | 1000010 |
4 | 0100011 | 0011101 | 1011100 |
5 | 0110001 | 0111001 | 1001110 |
6 | 0101111 | 0000101 | 1010000 |
7 | 0111011 | 0010001 | 1000100 |
8 | 0110111 | 0001001 | 1001000 |
9 | 0001011 | 0010111 | 1110100 |
標準タイプの1桁目は以下の表の通り、奇数パリティと偶数パリティの組み合わせによって決定されます。
短縮タイプの場合は全て奇数パリティになります。
1桁目 | 奇数(O)と偶数(E)の組み合わせ |
---|---|
0 | OOOOOO |
1 | OOEOEE |
2 | OOEEOE |
3 | OOEEEO |
4 | OEOOEE |
5 | OEEOOE |
6 | OEEEOO |
7 | OEOEOE |
8 | OEOEEO |
9 | OEEOEO |
つまり標準タイプで1234567890123
のようなJANコードは以下のように変換されます。
標準タイプなので1桁目の奇数パリティと偶数パリティの組み合わせを求める。今回の場合は1
なので上の表よりOOEOEE
となる。
2~6桁目を求めた奇数パリティと偶数パリティの組み合わせに従って上の表より求める。
2桁目は2
の奇数パリティなので0010011
となる。同じように3桁目は3
で奇数パリティなので0111101
、4桁目は4
で偶数パリティなので0011101
のように求めていく。
右は偶数パリティしか定義されていないので表の通りに変換する。
チェックデジット
JANコードの最後の1桁は読み取り結果の正誤を判定するためのチェックデジット[3]となっています。
チェックデジットは以下の通りに算出します。
桁番号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
バーコード | 4 | 9 | 3 | 3 | 0 | 3 | 2 | 0 | 1 | 0 | 5 | 7 | 9 |
-
全ての偶数桁の数字を加算し、その結果を3倍する。
(9+3+3+0+0+7)×3=66 -
チェックデジットとなる最後の桁を除いた、全ての奇数桁の数字を加算する。
(4+3+0+2+1+5)=15 -
1と2の結果を加算。
66+15=81 -
3の結果の10の剰余の値を10から引いた値がチェックデジット。
ただし、3の結果の10の剰余の値が0の場合はチェックデジットは0。(10-(81\%10))\%10=9
この場合は計算結果が9となりチェックデジットである最後の桁の値である9と合致しているので読み取り結果は正しいと言えます。
JANコードの生成
以上の手順に従って4933032010579
というJANコードを変換するとこのようになります。
レフトガードバー | 1桁目 | 2桁目 | 3桁目 | 4桁目 | 5桁目 | 6桁目 | センターバー | 7桁目 | 8桁目 | 9桁目 | 10桁目 | 11桁目 | チェックデジット | ライドガードバー |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
101 | 0001011 | 0100001 | 0111101 | 0001101 | 0100001 | 0011011 | 01010 | 1110010 | 1100110 | 1110010 | 1001110 | 1000100 | 1110100 | 101 |
これを1を黒、0を白で塗るとJANコードが完成します。
おわりに
個人的には1桁目を奇数パリティ・偶数パリティの組み合わせで表現しているのが面白いなぁと思いました。
ちなみにJANコードを生成するPythonのライブラリを作ってみたので良ければ触ってみてください😊
ソースコードはこちらにあります
参考文献
Discussion