SDXF(構造化データ交換フォーマット)は、RFC 3072で定義されたデータシリアル化フォーマットです。 [1]これにより、異なるタイプの任意の構造化データを1つのファイルに組み立てて、任意のコンピュータ間で交換できるようになります。
データを任意にシリアル化して自己記述形式にする機能はXMLを彷彿とさせますが、SDXF は XML のようなテキスト形式ではありません。つまり、SDXF はテキスト エディターと互換性がありません。SDXF を使用してエンコードされたデータ (複合および基本) の最大長は 16777215 バイト (16 MBより 1 少ない) です。
技術構造フォーマット
SDXF データは、任意のレベルの構造の深さを表現できます。データ要素は自己文書化されており、メタデータ(数値、文字列、または構造) がデータ要素にエンコードされます。この形式の設計はシンプルで透過的です。コンピューター プログラムは明確に定義された関数を使用して SDXF データにアクセスし、プログラマーが正確なデータ レイアウトを学習する必要がありません。
名前の「交換」という単語は、別の種類の透明性を反映しています。SDXF 関数は、コンピュータ アーキテクチャに依存しないデータ変換を提供します。シリアル化は、追加の手段なしでコンピュータ間で交換できます (直接ネットワーク、ファイル転送、または CD 経由)。受信側の SDXF 関数は、アーキテクチャの適応を処理します。
構造化データは、テキスト文字列よりも複雑なパターンを予測できるデータです。[2]
例
商業的な例: 2 つの企業がデジタル請求書を交換したいと考えています。請求書には、次のような階層的なネスト構造があります。
請求書 │ ├─ 請求書番号 ├─ 日付 ├─ 送信者アドレス │ ├─ 名前 │ ├─ 名前 │ ├─ ストリート │ ├─ 郵便番号 │ ├─ シティ │ └─ 国 ├─ 宛先_受信者 │ ├─ 名前 │ ├─ 名前 │ ├─ ストリート │ ├─ 郵便番号 │ ├─ シティ │ └─ 国 ├─ 請求金額 ├─ シングルアイテム │ ├─ シングルアイテム │ │ ├─ 数量 │ │ ├─ アイテム番号 │ │ ├─ アイテムテキスト │ │ ├─ チャージ │ │ └─ 合計 │ └─ ... ├─ 条件 ...
構造
基本要素はチャンクです。SDXF シリアル化自体がチャンクです。チャンクは、小さなチャンクのセットで構成できます。チャンクは、6 バイトのヘッダー プレフィックスとそれに続くデータで構成されます。ヘッダーには、2 バイトの 2 進数 (Chunk_ID) のチャンク識別子、チャンクの長さ、およびタイプが含まれます。圧縮、暗号化などの追加情報が含まれる場合もあります。
チャンク タイプは、データがテキスト (文字列) で構成されているのか、バイナリ数値 (整数または浮動小数点数) で構成されているのか、あるいはチャンクが他のチャンクの複合であるのかを示します。
構造化チャンクを使用すると、プログラマーは、上記の INVOICE などの階層構造を次のように SDXF 構造にパックできます。名前の付いた用語 (INVOICE、INVOICE_NO、DATE、ADDRESS_SENDER など) には、1 ~ 65535 (符号なしの 2 バイトの符号なしバイナリ整数) の範囲で一意の番号が与えられます。最上位/最も外側のチャンクは、レベル 1 の構造化チャンクとして、ID INVOICE (つまり、関連付けられた数値の chunk_ID) を使用して構築されます。この INVOICE チャンクには、レベル 2 以降の他のチャンク (INVOICE_NO、DATE、ADDRESS_SENDER、ADDRESS_RECIPIENT、INVOICE_SUM、SINGLE_ITEMS、CONDITIONS) が埋め込まれます。レベル 2 のチャンクの中には、2 つのアドレスと SINGLE_ITEMS について順に構造化されるものもあります。
正確な説明についてはRFCの2ページ目またはここを参照してください。[3]
SDXF を使用すると、プログラマーはコンパクトな関数セットを使用して SDXF 構造を操作できます。関数セットはごくわずかです。
チャンクを読み取るには、次の関数を使用する必要があります。
- 初期化
- パラメータ構造を初期化し、既存のチャンクにリンクします。
- 入力
- 構造化されたチャンクにステップインするには、この構造の最初のチャンクを処理する準備ができています。
- 離れる
- 現在の構造を離れます。この構造はすでに現在のものです。
- 次
- 存在する場合は次のチャンクに移動します (存在しない場合は現在の構造を離れます)。
- 抽出する
- 現在のチャンクからプログラム変数にデータを転送(および適応)します。
- 選択
- 指定されたチャンク ID を持つ次のチャンクを検索し、それを現在のチャンクにします。
チャンクを構築するには、次の関数を使用する必要があります。
- 初期化
- パラメータ構造を初期化し、空の出力バッファにリンクして新しいチャンクを作成します。
- 作成する
- 新しいチャンクを作成し、それを現在の既存の構造(存在する場合)に追加します。
- 追加
- 完全なチャンクを SDXF 構造に追加します。
- 離れる
- 現在の構造を離れます。この構造はすでに現在のものです。
次の疑似コードは請求書を作成します。
init ( sdx , buffersize = 1000 ); // SDXF パラメータ構造 sdx を初期化します。create ( sdx , ID = INVOICE , datatype = STRUCTURED ); // メイン構造の開始create ( sdx , ID = INVOICE_NO , datatype = NUM ERIC , value = 123456 ); // 基本チャンクを作成します。create ( sdx , ID = DATE , datatype = CHAR , value = "2005-06-17" ); // もう一度create ( sdx , ID = ADDRESS_SENDER , datatype = STRUCTURED ); // サブ構造create ( sdx , ID = NAME , datatype = CHAR , value = "Peter Somebody" ); // 要素。このサブ構造内のチャンク... create ( sdx 、ID = COUNTRY 、datatype = CHAR 、value = "France" ); // このサブ構造内の最後のチャンクleave ; // サブ構造 ADDRESS_SENDER を閉じる... leave ; // サブ構造 INVOICE を閉じる
[4]
INVOICE 構造を抽出する疑似コードは次のようになります。
init ( sdx , container = SDXF構造体へのポインタ) ; // SDXF パラメータ構造体を初期化します sdx enter ( sdx ); // INVOICE 構造体に結合します。// while ( sdx . rc == SDX_RC_ok ) { switch ( sdx . Chunk_ID ) { case INVOICE_NO : extract ( sdx ); invno = sdx . value ; // extract 関数は、パラメータ フィールド 'value' に整数値を入力しますbreak ; // case DATE : extract ( sdx ); strcpy ( invdate , sdx . data ); // sdx.data は、抽出された文字列へのポインタですbreak ; // case ADDRESS_SENDER : enter ( sdx ); // ADDRESS は構造化されたチャンクなので 'enter' を使用しますdo while ( sdx . rc == SDX_RC_ok ) // 内部ループ... break ; ... } }
SDXFは読みやすく、テキストエディタで変更できるように設計されていません。関連する編集可能な構造はSDEF(構造化データ編集可能形式)です。[5]
参照
参考文献
- ^ ワイルドグルーブ、マックス (2001 年 3 月)。 「RFC-3072」。
- ^ここでの「構造化」は、 構造化プログラミングと同じ意味で使用されていると主張することもできます。つまり、(厳密に) 構造化されたプログラムにはgotoがないように、SDXF にはポインタや参照がありません。ただし、名前の由来は必ずしもこれではありません。
- ^ 「SDXF - 2. SDXF 形式の説明」。Pinpi.com。2013年 9 月 10 日閲覧。
- ^ 「6.3 プロジェクト PRNT: 完全な例」. PINPI . 2013 年 9 月 10 日閲覧。
- ^ 「SDEF サイト (Archive.org より)」。2016 年 3 月 7 日時点のオリジナルよりアーカイブ。
外部リンク
- より詳しい説明の導入章
