サイトマップ
【データ解析講座】 第2回「データの仕組みを知る」
うぉっほん…。前回の講座は役に立ったかのぅ…。
さて、今回じゃが「データの仕組みを知る」ということで、第1回で説明した16進数表記がゲームの中ではどのように表現をされているのかを説明するぞい。
まず、表記に関する主な考え方には以下の2つの考え方があるのじゃ。
表記に関する主な考え方
・2進化10進数と固定小数点数
・数値表記とフラグ表記
…上記の言葉を見てピーンときたかのぅ?
ピーンと来るようであれば今回の講座は見なくてもよいぞ。「何のことやらさっぱり…」というものは以下の説明をしっかりと見ることじゃのぅ…。
2進化10進数と固定小数点数の違い
まずはじめに、2進化10進数と固定小数点数の違いについてじゃが…第1回で「10進数→2進数→16進数」の関係について説明をしたかと思ったが、後者の固定小数点数とは前回説明をした以下のようなものじゃ…。
例えば、あるゲームで経験値が1234のときのデータは、固定小数点数では下記の表のように表現されるのじゃ。
○×進数表記
-
-
-
数値
10進数表記
-
-
-
1234
16進数表記
-
4
2
D
2進数表記
-
0100
0010
1101
どうじゃ?覚えておったかのぅ…。
そして2進化10進数じゃが…これは以下のように表現されるのじゃ。
例えば、あるゲームで経験値が1234のときのデータは、2進化10進数では下記の表のように表現されるのじゃ。
○×進数表記
千の位
百の位
十の位
一の位
10進数表記
1
2
3
4
16進数表記
01
02
03
04
2進数表記
0001
0010
0011
0100
また2進化10進数の中でもパック表現とゾーン表現というものがあるのじゃが…それはこのような違いを言うのじゃ。
例えば、あるゲームで経験値が63のときのデータは、下記の表のように表現されるのじゃ。
表記方法
-
-
-
数値
ゲーム上の表現
-
-
-
99
10進数表記
-
-
-
99
16進数表記
-
-
6
3
2進数表記
-
-
0110
0011
パック表現
-
-
0110
0011
ゾーン表現
0000
0110
0000
0011
どうじゃ?違いがわかるかのぅ…。
ちなみに、パック表現では奇数桁表現ができないという制約があり、100なら0100と4ブロック表現をしなくてはならないのじゃ。(正確には符号部があり6ブロック必要なのじゃガ、ここは割愛させてもらうぞい)
つまりじゃ、2進化10進数では4桁の数字「1234」を表現するのに、4つのデータブロックを使用するのに対し、固定小数点数では4桁の数字「1234」が3桁で表現でき、使用するデータブロックも3つで済むため、データを小さく収めることができるという訳なのじゃ。さらに2進化10進数中でもゾーン表現にすると8ブロックも使用してしまうというわけじゃ。
ところで…ここで「ブロック」という表現が出てきたんじゃが、「ブロック」というのは1つのデータ(数値)の塊のことで、ここでは4ビットを1ブロックとして表現しておる。
…何じゃ?また「ビット」という表現が出てきて困惑しておるのかのぅ…。
「ビット」というのは2進数で表現する際に用いる位のことでのぅ…「01」なら2ビット、「0100」なら4ビット、「11011001」なら8ビットというのじゃ。ファミコンのことを「8ビットマシン」などと表現をするのじゃが、これはファミコンが1度に8ビットのデータ(数値)を処理することができるという意味なのじゃ。
また、8ビット=1バイトとも表現できるのじゃが…モデムという機械の転送速度表現で「56kbps」と書いてあるものがあるとすると…これは「56キロビット/秒」を表しており、1秒間に56000ビットのデータを転送できるという意味なのじゃ。バイト表現なら7KBpsと表現するのじゃ。(kbps=キロ・ビット・パー・セカンドと読むのじゃ)
ちなみに…正確には1キロビット=1024ビット(2の10乗)なのじゃが、計算が面倒なので最近は1キロビット=1000ビットで計算をしてるケースが多いのじゃ。ゆえにハードディスクが80GBと書いてある商品を購入しても、パソコン上の表現では76GBとなっているのは、この誤差によるものなのじゃ。(なんか損をした気分じゃが、慣例化しておるからのぅ…)
なお…バイナリーエディタでは1ブロックを16ビットとして表現しており、1ブロックでどのように数値表現をするかは作り手(プログラマー)によってまちまちじゃ。(1ブロック=FF(16進数))
例にあげると…123という数字を16進数表記なら「7B」、2進化10進数パック表現なら「0123(=0000,0001,0010,0011)」、2進化10進数ゾーン表現なら「010203(=0000,0001,0000,0010,0000,0011)」と1ブロック、2ブロック、4ブロック…とデータの大きさに差が出てしまうということなのじゃ。
ここまでついてこれているかのぅ…。
数値表記とフラグ表記の違い
ここからは実際のゲームを例に出して説明するぞい。
数値表記については特に説明するまでもないが、ドラクエIIIで言えば、HP:240とかいう数字によって表現されるものじゃ。
…で、フラグ表記についてじゃが、フラグ(=旗)という名前の通り、旗が立っているか立っていないかによって状態を表すというものじゃ。
ここではドラクエIIIのルーラによって行ける場所を例に出して説明をするぞい。
行ったことのある城・町・村の名前
行った or 行ってない
フラグ
アリアハン
行った
1
レーベ
行った
1
ロマリア
行った
1
カザーブ
行ってない
0
ノアニール
行ってない
0
アッサラーム
行ってない
0
イシス
行ってない
0
ポルトガ
行った
1
例えば、こんな感じじゃと、フラグを倒して「10000111」とする。これをバイナリーエディタでの表示16進数に置き換えると「87」となる。
これを「FF」に書き換えたとすると、アリアハン〜ポルトガまでの全ての場所に行ったこととなる。
では、実際にデータを改竄してみるぞい…。
ゲームをスタートした直後の画面(右下に母親が主人公を王様に謁見させるために待っている状況)
なぜかアレフガルドに行ったことがあることになっている。
…とこんなことも可能なのじゃ。
オルテガが勝利するも…。
※戦闘中のステータスも変更可能
どうじゃ、データの仕組みはわかったかのぅ…。
余談じゃが…昔はソーン2進化10進数を使っていて、それがパック2進化10進数、そして最近は16進数を使っているようじゃ。先にも説明したが、ゾーン2進化10進数と16進数では同じブロック数で表現できる数値に雲泥の差があるからのぅ…。
今回はここまでじゃ。
何か質問があれば、Bigfireの御仁宛にメールを送ってもらおうかのぅ…。
第3回へつづく