Top > C++ > XData

XData Edit

はじめに Edit

XDataとは,お手製の「XML to バイナリデータ」の仕組みのことです。
このページにはXDataに関する情報を記述します。

特徴 Edit

  • データをXMLで記述でき,それをバイナリデータに変換できる
  • エンディアンはBE,LEどちらにも対応
  • 文字列は様々な文字コードの変換可能
  • ラベル&リファレンス機能を使えば,データの先頭からのオフセット距離を埋め込むことも可能

XML Edit

タグ仕様 Edit

要素 element
名前説明属性子となる要素
ルートタグ
xdata_rootルートとなる要素major_version
minor_version
sint??,uint??,float??,reference,label,align
データ格納タグ
sint8
sint16
sint32
sint64
符号有り整数データを格納する要素。
sintの後の数値はbit数を示す。
value属性には指定のbit数で表現できる範囲内の整数を入れる。
value
uint8
uint16
uint32
uint64
符号無し整数データを格納する要素。
uintの後の数値はbit数を示す。
value属性には指定のbit数で表現できる範囲内の整数を入れる。
value
float32
float64
浮動小数データを格納する要素。
floatの後の数値はbit数を示す。
value属性には指定のbit数で表現できる範囲内の整数を入れる。
value
referenceデータのオフセット位置データを格納する要素。label_name
その他
labelデータのオフセット位置を表現する要素。
referenceタグから参照される。
name
align次に設置するデータのアライメントを表現する要素。
valueにはアライメント値をuint32の範囲内で指定する。
value
属性 attribute
名前説明
major_versionXDataのXMLフォーマットのメジャー番号。
minor_versionXDataのXMLフォーマットのマイナー番号。
value数値。有効な数値は要素によって異なる。
nameラベル名。この値が1つのXML内で重複してはならない。
label_name参照するラベル名。

サンプル Edit

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
<?xml version="1.0" encoding="utf-8"?>
<xdata_root
major_version="1"
minor_version="1"
>
    <reference label_name="pos_array"/>
    <label name="pos_array"/>
    <sint8_array count="3">-128 127 1</sint8_array>
    <uint8 value="0"/>
    <uint16 value="0"/>
    <uint32 value="0"/>
    <uint64 value="0"/>
    <sint8 value="0"/>
    <sint16 value="0"/>
    <sint32 value="0"/>
    <sint64 value="0"/>
    <float32_array count="4">1.0 0.5 0.25 <!-- comment --> 0 </float32_array>
    <float32 value="3.1415926534"/>
    <float64_array count="0"></float64_array>
    <float64 value="10000.2"/>
    <string value="test"/>
    <align value="32"/>
</xdata_root>

コンバータ Edit

概要 Edit

xdata_conv.exeは、XMLファイルをバイナリファイルに変換するコマンドラインアプリケーションです。
.Netframework2.0を使用しています。Windows上で実行する場合は、.Netframework2.0以上のランタイムをインストールしてください。
他のOSでは、monoなどのランタイムをインストールして使用してください。

コマンドラインサンプル Edit

XMLファイルのパス。input.xml
出力するバイナリファイルのパス。output.bin

./xdata_conv.exe input.xml output.bin

コマンドラインオプション Edit

-endian
  • エンディアンを指定します。
  • BE : ビッグエンディアン。
  • LE : リトルエンディアン。(デフォルト)
-encoding
  • stringタグで格納される文字列のエンコードを指定します。
  • 例えば'utf_8','shift_jis'が入ります。
  • デフォルトは'utf_8'です。
-ignoreLabelNotFoundError
  • referenceで指定されているラベルが見つからないエラーを無視します。
-silent
  • 変換情報の標準出力を切ります。

C++ライブラリ Edit

ヘッダ Edit

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
-
|
!
|
|
|
-
|
!
!
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
|
|
|
-
|
|
|
|
|
|
!
|
|
|
-
|
|
|
|
|
|
-
!
|
|
|
-
|
!
|
|
|
-
|
|
|
|
|
|
|
!
|
|
|
|
|
|
-
|
-
|
!
|
!
|
|
|
|
|
|
-
|
-
|
!
|
|
|
-
|
!
|
!
|
|
|
!
|
!
 
 
 
/**
 * @file
 * @brief XData型を記述する。
 */
#if defined(XDATA_INCLUDED_XDATA_HPP)
#else
#define XDATA_INCLUDED_XDATA_HPP
 
//------------------------------------------------------------
 
/**
 * @brief BigEndian環境かどうか指定するマクロオプション。
 * 指定されていなければ、__BIG_ENDIAN__が定義されているかどうかで判定。
 */
#if defined(XDATA_OPTION_IS_BIG_ENDIAN)
#else
 
#if defined(__BIG_ENDIAN__)
#define XDATA_OPTION_IS_BIG_ENDIAN
#endif
 
#endif
 
#if defined(XDATA_OPTION_IS_BIG_ENDIAN)
#define XDATA_IS_BIG_ENDIAN
#else
#define XDATA_IS_LITTLE_ENDIAN
#endif
 
 
//------------------------------------------------------------
namespace xdata {
 
    /// @name TypeDef
    //@{
    typedef signed char SInt8;
    typedef signed short SInt16;
    typedef signed int SInt32;
    typedef unsigned char  UInt8;
    typedef unsigned short UInt16;
    typedef unsigned int   UInt32;
    typedef float Float32;
    typedef double Float64;
    typedef UInt32 Reference;
    //@}
 
    /// 文字列のヘッダ。
    struct String
    {
        UInt32 byteLength;  ///< 文字列データのバイト数。(終端文字数は含まない)
 
        /// 文字列データの先頭ポインタ。
        const void* ptr()const
        {
            return &(&byteLength)[1];
        }
 
        /// const char* に変換。
        const char* toCStr()const
        {
            return reinterpret_cast< const char* >( ptr() );
        }
    };
 
    /// 定数群。
    class Constant
    {
    public:
        /// XBIN(Xdata BINary)を示す4文字。
        static const UInt32 SIGNATURE = 
#if defined(XDATA_IS_BIG_ENDIAN)
            0x5842494E;
#else
            0x4E494258;
#endif
        /// エンディアンを示す値。
        static const UInt16 ENDIAN = 0x1234;
        /// メジャーバージョン
        static const UInt8 VERSION_MAJOR = 1;
        /// マイナーバージョン
        static const UInt8 VERSION_MINOR = 1;
        /// バージョン
        static const UInt16 VERSION = VERSION_MAJOR * 0x100 + VERSION_MINOR;
    };
 
    /// XDataのヘッダ。
    struct XDataHeader
    {
        UInt32 signature; ///< シグネチャ。Constant::SIGNATUREと等しい。
        UInt16 endian;    ///< エンディアンチェッカー。Constant::ENDIANと等しい。
        UInt8  versionMajor; ///< メジャーバージョンを示す値。VERSION_MAJORに等しい。
        UInt8  versionMinor; ///< マイナーバージョンを示す値。VERSION_MINOR以下。
        UInt32 datasize;  ///< ヘッダを含むデータサイズ。バイト数。
        UInt32 pageCode;  ///< 文字列のページコード。.netframeworkのページコード番号が入る。
    };
 
    /// バイナリ形式のXDataへのアクセサ。
    class XData
    {
    public:
        /// デフォルトコンストラクタ。
        XData() : ptr_(0){}
        /// バイナリデータの先頭アドレスを指定して作成。
        XData( const void* aPtr ) 
            : ptr_( static_cast< const XDataHeader* >( aPtr ) )
        {
        }
 
        /// 保持しているポインタを取得する。
        const void* ptr()const
        { 
            return ptr_; 
        }
 
        /// 正しいXDataか。
        bool isValidData()const
        {
            return ptr_ != 0
                && ptr_->signature == Constant::SIGNATURE
                && ptr_->endian == Constant::ENDIAN
                && ptr_->versionMajor == Constant::VERSION_MAJOR
                && ptr_->versionMinor <= Constant::VERSION_MINOR
                && sizeof(XDataHeader) <= ptr_->datasize
                ;
        };
 
        /**
         * @brief データ本体の先頭アドレスを取得する。
         * 無効なデータならNULLポインタを返します。
         */
        const void* dataHeadAddress()const
        {
            if ( !isValidData() )
            {// 無効なデータならNULLポインタを。
                return 0;
            }
            return &ptr_[1];
        }
 
        /**
         * @brief Referenceタグの値からLabelのアドレスを取得する。
         * 無効なデータおよび無効な引数ならNULLを返します。
         */
        const void* labelAddressWithReference( const Reference aReferenceValue )const
        {
            if ( !isValidData() )
            {// 無効なデータならNULLポインタを。
                return 0;
            }
            if ( aReferenceValue < sizeof(XDataHeader) // ヘッダの中を指している
                || ptr_->datasize < aReferenceValue // データの外を指している
                )
            {// 範囲外
                return 0;
            }
            return &reinterpret_cast< const UInt8* >( ptr_ )[ aReferenceValue ];
        }
 
    private:
        const XDataHeader* ptr_;
    };
 
}
//------------------------------------------------------------
#endif
// EOF

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Tue, 23 Mar 2010 22:59:29 JST (5148d)