使われる桁・使われない桁、ビット散布、EAN-8の扱い
※ このページで説明するのは市販のJAN/EANの話です。データックはバンダイ純正カード用の独自形式も読み、そちらは別のルールで動きます(解析4 バンダイのバーコード)。
日本語 | English | Français | Español | Italiano | 한국어
バーコード13桁を左から d1〜d13 と呼ぶ。例えば 4902773230126 なら
d1=4, d2=9, …, d13=6。各桁の値(0〜9)を2進数で見たときの最下位ビットを b0、以下 b1, b2, b3 と書く(d6=7 なら b0=1, b1=1, b2=1, b3=0)。
最初の重要な事実。キャラクターとステータスの計算に使われるのは d3〜d12 の10桁だけで、先頭2桁(国コード)と末尾のチェックデジットは結果に一切影響しない。つまり 4902773230126 と 4502773230128(先頭を45に変えてチェックデジットを付け直したもの)は同じ結果になる。かつて「国コード部分は意味なし」と実験で突き止めた先人がいたが、プログラム側の処理を読むとそのとおりに実装されている。
ただしチェックデジットは「計算に使われない」だけで、「どんな値でもよい」わけではない。計算に入る手前のバーコード読み取り部はチェックデジットをきちんと検算しており、数字の並びが合わないコードはそこで読み取りエラーになる。上の例で先頭を45に変えたときにチェックデジットを付け直しているのはそのためで、チェックデジットだけを差し替えたコードは、そもそも読み取ってもらえない。生成結果の計算には使われないが、読み取り時の妥当性検査には使われる、というのが正確なところである。この検算の存在は実測データの食い違いを追ううちに判明したもので、経緯は小ネタに書いた。
d3〜d12 の10桁は、それぞれ4ビット(b0〜b3)に分解され、合計40ビットが固定の対応表に従って5バイトの内部レジスタ R0〜R4 に1ビットずつバラバラに再配置される。これが解析を難しくしていた正体で、隣り合う桁の情報が遠く離れたビットに飛ばされるため、桁単位でいくら実験しても法則が「割り切れない」ように見える。
対応表の全体(列=元の桁のビット、値=行き先のレジスタとビット位置):
| 桁 | b0の行き先 | b1の行き先 | b2の行き先 | b3の行き先 |
|---|---|---|---|---|
| d3 | R3 bit7 | R2 bit4 | R4 bit4 | R3 bit4 |
| d4 | R0 bit5 | R2 bit0 | R3 bit6 | R3 bit3 |
| d5 | R1 bit1 | R3 bit0 | R0 bit3 | R4 bit0 |
| d6 | R1 bit3 | R1 bit5 | R0 bit0 | R4 bit3 |
| d7 | R0 bit7 | R0 bit1 | R1 bit7 | R3 bit2 |
| d8 | R1 bit4 | R2 bit3 | R4 bit5 | R2 bit2 |
| d9 | R2 bit7 | R1 bit0 | R2 bit6 | R4 bit6 |
| d10 | R0 bit2 | R4 bit1 | R3 bit1 | R3 bit5 |
| d11 | R1 bit2 | R2 bit1 | R0 bit4 | R4 bit2 |
| d12 | R0 bit6 | R4 bit7 | R1 bit6 | R2 bit5 |
40ビットが40ビットに過不足なく対応する(全単射)。つまり情報は一切捨てられず、並び替えられているだけである。
再配置された R0〜R4 は、先頭(R0の最上位ビット)から順に消費される 40ビットのビット列として扱われる。読み出しの内訳はぴったり40ビットで割り切れる:
| 読む量 | 用途 | 詳細ページ |
|---|---|---|
| 2ビット | アイテム枠かキャラ枠かの判定 | 解析2 |
| 8ビット | キャラクターの重み付き抽選 | |
| 3ビット | 必殺技レベル | 解析3 |
| 9ビット ×3 | HP・BP・DP(各9ビット) |
タバコや小物に付いている8桁のバーコードも読める。ゲームは8桁 o1〜o8 を鏡像に折り返して有効10桁を組み立ててから、EAN-13とまったく同じ処理に流す。有効10桁は次のようになる:
[o3, o4, o5, o6, o7, o8, o7, o6, o5, o4]
つまりEAN-8では o3〜o8 の6桁しか情報がなく、しかも o4〜o7 は2回ずつ使われる。 EAN-8のチェックデジット(o8)が計算に参加する点もEAN-13と違って面白いところ。そのため8桁では、o8を1桁書き間違えるだけでステータスのずれとして表に出てくる。実測記録の食い違いを解く手がかりになったのがこの性質だった。