« Array/Dictionary のバイナリ読み書き対応 | メイン | 無料版なんて要らなかった? »

2013年03月06日

吉里吉里 その他の開発日誌:: Array/Dictionary のバイナリ形式フォーマット

    

ほぼ 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
Total : Today : Yesterday : なかのひと