« Array/Dictionary のバイナリ読み書き対応 | メイン | 無料版なんて要らなかった? »
2013年03月06日
吉里吉里 その他の開発日誌:: Array/Dictionary のバイナリ形式フォーマット
Tweet @jin1016をフォローほぼ MessagePack と同じようなものだけど、違う部分もあるので書いておく。
バイナリのシリアライズ可能形式である MessagePack を元に TJS2 で使用されるデータ等を考慮して少し変更したデータフォーマットを用いている。
バイトコードと合わせるために値はリトルエンディアン。
基本的には、型情報、長さ、値と続く。
型情報は1バイトで格納し、その型情報に従い長さ情報が付与される。
型自体が長さを表していたり、型情報自体が値を表しているものもある。
たとえば、小さい数値はそのままの値で格納され、int8 や int16 などは型自体が長さを表し、長さ情報を省略している。
辞書配列は、必ず文字列と値のペアで格納される。
最初にいずれかの文字列型がきて、次に他の型が入る。
配列や辞書配列を入れ子にすることも可能。
文字列は、TJS2 の内部型と同じ UTF-16 のまま入る。
タイプ | 値 | 説明 |
正の整数固定値 | 0x00 - 0x7F | 正の整数の値 ( 0 - 127 ) はそのまま格納する。 |
負の整数固定値 | 0xE0 - 0xFF | 負の整数の値 ( -32 - -1 ) はそのまま格納する。 |
NULL | 0xC0 | NULL値 |
void | 0xC1 | void値 |
true | 0xC2 | true値。TJS2では未使用。 |
false | 0xC3 | false値。TJS2では未使用。 |
String 8 | 0xC4 | 文字列型、長さ情報は1バイトで、1文字は2バイト。 |
String 16 | 0xC5 | 文字列型、長さ情報は2バイトで、1文字は2バイト。 |
String 32 | 0xC6 | 文字列型、長さ情報は4バイトで、1文字は2バイト。 |
float | 0xCA | float値。値は4バイト。TJS2では未使用。 |
double | 0xCB | double値。値は8バイト。TJS2では未使用。 |
unsigned int 8 | 0xCC | 符号なし整数値、1バイト長の値。 |
unsigned int 16 | 0xCD | 符号なし整数値、2バイト長の値。 |
unsigned int 32 | 0xCE | 符号なし整数値、4バイト長の値。 |
unsigned int 64 | 0xCF | 符号なし整数値、8バイト長の値。 |
int 8 | 0xD0 | 符号付き整数値、1バイト長の値。 |
int 16 | 0xD1 | 符号付き整数値、2バイト長の値。 |
int 32 | 0xD2 | 符号付き整数値、4バイト長の値。 |
int 64 | 0xD3 | 符号付き整数値、8バイト長の値。 |
固定サイズバイナリ列 | 0xD4 - 0xD9 | 0xD4(0個)~0xD9(5個)としたバイト列。型自体が長さを表す。 |
バイナリ列 16 | 0xDA | 2バイト長でサイズを表すバイナリ列。 |
バイナリ列 32 | 0xDB | 4バイト長でサイズを表すバイナリ列。 |
配列 16 | 0xDC | 2バイト長で個数を表す配列。 |
配列 32 | 0xDD | 4バイト長で個数を表す配列。 |
辞書配列 16 | 0xDE | 2バイト長で個数を表す辞書配列。 |
辞書配列 32 | 0xDF | 4バイト長で個数を表す辞書配列。 |
固定長文字列 | 0xA0 - 0xBF | 0xA0(0)~0xBF(31)の長さを持つ文字列。型自体が長さを表す。後に文字列が付く。 |
固定長配列 | 0x90 - 0x9F | 0x90(0)~0x9F(15)の長さを持つ配列。型自体が長さを表す。後に配列が続く。 |
固定長辞書配列 | 0x80 - 0x8F | 0x80(0)~0x8F(15)の長さを持つ辞書配列。型自体が長さを表す。後に辞書配列が続く。 |
ファイルを識別するためのヘッダーが最初に8バイト付与されている。
内容は以下の通り。
'K' | 'B' | 'A' | 'D' |
'1' | '0' | '0' | \0' |
投稿者 Takenori : 2013年03月06日 03:00
comments powered by Disqus