WXF形式について
WXFは,外部のストレージに適した形式,あるいは他のプログラムとやり取りできる形式でWolfram言語式を忠実に直列化するためのバイナリ形式である.WXFは,多数のプログラミング言語で利用可能な低レベルのネイティブ型を使って簡単に解釈できるので,他のプログラミング言語でWolfram言語を読み書きするための形式として適したものになっている.
Wolfram言語式とその直列化された形式との間の変換のための基本的な関数は,BinarySerializeとBinaryDeserializeである.ExportおよびImportには,WXFデータを使ったファイルの読み書きのサポートが組み込まれている.
BinarySerialize[expr] | 任意の式 expr のバイナリ表現をWXF形式で与える |
BinaryDeserialize[bytearray] | WXF形式のバイナリ表現から式を取り出す |
Import[file,"WXF"] | WXFファイルをインポートして,式を返す |
Export[file,expr,"WXF"] | 任意の式を直列化して,それをWXFファイルとして保存する |
ImportByteArray[ba,"WXF"] | データをインポートして式を返す |
ExportByteArray[expr,"WXF"] |
Wolfram言語でWXFを直列化および非直列化する多くの方法
基本構造
WXFのデータは,常にプレーンテキストのASCIIのヘッダの後にバイトの文字列が続く.ヘッダはバイトを復号化する方法を指定し,部分の列を表すバイト列とコロンで分けられている.
バイト値
|
文字表現 (ISO8859-1)
|
部分型
|
102 | "f" | 関数 |
67 | "C" | 符号付き8ビット整数 |
106 | "j" | 符号付き16ビット整数 |
105 | "i" | 符号付き32ビット整数 |
76 | "L" | 符号付き64ビット整数 |
114 | "r" | IEEE倍精度実数 |
83 | "S" | 文字列 |
66 | "B" | バイナリ列 |
115 | "s" | シンボル |
73 | "I" | 大きい整数 |
82 | "R" | 大きい実数 |
193 | "Á" | パックアレー |
194 | "Â" | 数値配列 |
65 | "A" | 連想 |
58 | ":" | 連想における遅延規則 |
45 | "-" | 連想における規則 |
基本的な例
Range[10]の直列化された形式に対するバイトを与える:
複数の部分を持つ例
前のセクションの例は,単独の部分で構成されていた.トークンリストからの2つのトークンの後に,サイズ情報,データが続いた.このセクションの例には,複数の部分と型が含まれている.以下のインタラクティブな例から見てみる.
次の例は3要素のリストである.このリストは長さ3の関数として表され,頭部Listの後に3つの部分が続く.最初の部分はトークンと"Integer8"を使って整数を簡約形で表すために使われる形式を導入する.最後の部分はByteArrayの表現を表示する.
{1,-1,ByteArray[{1,2,3}]}の直列化された形式に対するバイトを与える:
頭部は4バイトのシンボル,つまりListである:
ヘッダ
ヘッダはさまざまな長さのプレーンのASCII文字列であり,文字":"で分けられる.WXFの現行バージョン(1.0)では,ヘッダの最初のバイトは文字"8"(バイト値56)である.バイナリ直列化がzip圧縮されると,このことはヘッダの文字"C"で表される.ヘッダは圧縮されることはない.圧縮は,後続のバイト列にのみ適用される.
レングス圧縮 (Varint)
- 汎用の式(関数にはトークンタイプ"f")やAssociation等のさまざまな数の部分を持つ型
WXFでは,長さやサイズを表すすべての整数はvarint法を使って直列化される.varintは指示可変長形式であり,整数が小さくなるにつれ必要なバイト数が少なくなる.最後のバイト以外の各バイトに最上位ビット(MSB)がある.MSBは,ストリームの後続のバイトもvarintの一部ならば,それは連続マーカーとしての役割を果たすことを示す.小さい整数では必要なバイトも少ない.各バイトの下位7ビットは,最下位グループを先頭として,整数のバイナリ表現を保存する.
文字列,シンボル,非機械数
文字列,記号,非機械数は同じ形式を使って表される.最初のバイトはトークンであり,次にvarint形式で符号化されたバイト数,次に式の文字列InputFormに対応する,UTF-8で符号化されたUnicode文字列が続く.非機械数は,表現するのに$SystemWordLengthのビット以上を必要とする任意精度実数,または整数である.
シンボル
|
トークン
|
表現
|
String | "S" | Unicodeの文字列 |
Symbol | "s" | System`シンボルを除く,コンテキストを指定するシンボルの完全修飾名 |
任意精度実数 | "R" | 仮数,そして最終的には精度と指数を指定する桁表現 |
大きい整数 | "I" | 桁の列 |
InputFormベースの型
次の2バイトは前の例で見られるように,varintで符号化した500である:
機械整数の直列化
トークン
|
定義
|
型のサイズ
|
"C" | 符号付き8ビット整数 | |
"j" | 符号付き16ット整数 | |
"i" | 符号付き32ット整数 | |
"L" | 符号付き64ット整数 |
機械実数の直列化
機械精度の複素数は,2つの機械精度実数の関数として直列化される.以下の図表は2つの実数が後続する頭部Complexを強調している.
ヘッダの後の最初のバイトは頭部がComplexの長さ2の関数である:
関数の直列化
WXFでは関数は,文字"f"の後にvarint形式の式の長さを置いて表される.要素の数は,頭部の場合は1を増分とした長さに等しい.頭部と部分は直列化された任意の式である.特に頭部は関数でもあり得る.Select[OddQ][{1,2,3}]は頭部がSelect[OddQ]の長さ1の関数であるが,その頭部自身も頭部Selectを持つ長さ1の関数である.
式が評価されないように,Unevaluatedを使って,式を直列化する:
連想の直列化
連想の規則は文字"-"で,遅延規則は文字":"で表される.これらの文字の直後には,任意の2つの直列化された式が続く.連想の規則の長さは常に2であるため,省略される.以下に示すのは,簡単な連想の直列化である.
最初の要素は頭部がRuleの長さ2の関数である:
2番目の要素も長さ2の関数であるが,頭部はRuleDelayedである:
直列化された長さはほぼ文字列FullFormのサイズと同じになる:
バイナリ列
数値配列
配列は,機械精度の数値による多次元の表である.配列は,配列の型を指定するトークン,値の型を指定するトークン,varint形式による階数,整数列としてのvarint形式による次元,データの順で表される.
WXF形式には,トークン"Á"(バイト値193)で表されるパック配列,およびトークン"Â"(バイト値194)で表される数値配列の2つの配列の型がある.この2つはわずかに異なっている.大きい違いとして,以下の表に示すように,サポートされる値の型がある.
整数値
|
16進法表現における値
|
配列型
|
0 | 0016 | 8ビット符号付き整数配列 |
1 | 0116 | 16ビット符号付き整数配列 |
2 | 0216 | 32ビット符号付き整数配列 |
3 | 0316 | 64ビット符号付き整数配列(64ビットシステムのみ) |
34 | 2216 |
IEEE単精度実数配列(float)
|
35 | 2316 |
IEEE倍精度実数配列(double)
|
51 | 3316 | IEEE単精度複素数配列 |
52 | 3416 | IEEE倍精度複素数配列 |
整数値
|
16進表現における値
|
配列型
|
0 | 0016 | 8ビット符号付き整数配列 |
16 | 1016 | 8ビット符号なし整数配列 |
1 | 0116 | 16ビット符号付き整数配列 |
17 | 1116 | 16ビット符号なし整数配列 |
2 | 0216 | 32ビット符号付き整数配列 |
18 | 1216 | 32ビット符号なし整数配列 |
3 | 0316 | 64ビット符号付き整数配列 |
19 | 1316 | 64ビット符号なし整数配列 |
34 | 2216 |
IEEE単精度実数配列(float)
|
35 | 2316 |
IEEE倍精度実数配列(double)
|
50 | 3316 | IEEE単精度複素数配列 |
51 | 3416 | IEEE倍精度複素数配列 |
以下のインタラクティブな図表は,パックする前の前出の行列の直列化を示している.要素の列は頭部Listのネストされた関数を含んでいるため,全く異なっている.内部のリストは,整数値に対応する3つの部分を持っている.整数値のバイナリ表現はパックアレーの場合に見られたもの(リトルエイディアンの符号付16ビット整数)と似ている
配列の値型のトークンはビットフィールドとして構築される.下位の4ビットはバイトの数値型の大きさのログを保存し,上位の4ビットは数値型を表す.複素型の場合,大きさは正の整数を指すので,例えば単精度複素型は8バイトの大きさを持つとみなされる.