解析1 バーコードの読まれ方

使われる桁・使われない桁、ビット散布、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桁だけ

最初の重要な事実。キャラクターとステータスの計算に使われるのは d3〜d12 の10桁だけで、先頭2桁(国コード)と末尾のチェックデジットは結果に一切影響しない。つまり 4902773230126 と 4502773230128(先頭を45に変えてチェックデジットを付け直したもの)は同じ結果になる。かつて「国コード部分は意味なし」と実験で突き止めた先人がいたが、プログラム側の処理を読むとそのとおりに実装されている。

ただしチェックデジットは「計算に使われない」だけで、「どんな値でもよい」わけではない。計算に入る手前のバーコード読み取り部はチェックデジットをきちんと検算しており、数字の並びが合わないコードはそこで読み取りエラーになる。上の例で先頭を45に変えたときにチェックデジットを付け直しているのはそのためで、チェックデジットだけを差し替えたコードは、そもそも読み取ってもらえない。生成結果の計算には使われないが、読み取り時の妥当性検査には使われる、というのが正確なところである。この検算の存在は実測データの食い違いを追ううちに判明したもので、経緯は小ネタに書いた。

40ビットの「散布」

d3〜d12 の10桁は、それぞれ4ビット(b0〜b3)に分解され、合計40ビットが固定の対応表に従って5バイトの内部レジスタ R0〜R4 に1ビットずつバラバラに再配置される。これが解析を難しくしていた正体で、隣り合う桁の情報が遠く離れたビットに飛ばされるため、桁単位でいくら実験しても法則が「割り切れない」ように見える。

対応表の全体(列=元の桁のビット、値=行き先のレジスタとビット位置):

桁b0の行き先b1の行き先b2の行き先b3の行き先
d3R3 bit7R2 bit4R4 bit4R3 bit4
d4R0 bit5R2 bit0R3 bit6R3 bit3
d5R1 bit1R3 bit0R0 bit3R4 bit0
d6R1 bit3R1 bit5R0 bit0R4 bit3
d7R0 bit7R0 bit1R1 bit7R3 bit2
d8R1 bit4R2 bit3R4 bit5R2 bit2
d9R2 bit7R1 bit0R2 bit6R4 bit6
d10R0 bit2R4 bit1R3 bit1R3 bit5
d11R1 bit2R2 bit1R0 bit4R4 bit2
d12R0 bit6R4 bit7R1 bit6R2 bit5

40ビットが40ビットに過不足なく対応する(全単射)。つまり情報は一切捨てられず、並び替えられているだけである。

散布後は「ビットの読み出し順」がすべてを決める

再配置された R0〜R4 は、先頭(R0の最上位ビット)から順に消費される 40ビットのビット列として扱われる。読み出しの内訳はぴったり40ビットで割り切れる:

読む量用途詳細ページ
2ビットアイテム枠かキャラ枠かの判定解析2
8ビットキャラクターの重み付き抽選
3ビット必殺技レベル解析3
9ビット ×3HP・BP・DP(各9ビット)

EAN-8(8桁の短縮バーコード)の扱い

タバコや小物に付いている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桁書き間違えるだけでステータスのずれとして表に出てくる。実測記録の食い違いを解く手がかりになったのがこの性質だった。

まとめ:バーコードは「乱数の種」ではない。40ビットを決まった位置に並べ替えて決まった順に読むだけの、完全に決定的な仕組みである。同じバーコードからは必ず同じキャラが出る。

→ 解析2 キャラ決定へ