XDataとは,お手製の「XML to バイナリデータ」の仕組みのことです。 このページにはXDataに関する情報を記述します。
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>
xdata_conv.exeは、XMLファイルをバイナリファイルに変換するコマンドラインアプリケーションです。 .Netframework2.0を使用しています。Windows上で実行する場合は、.Netframework2.0以上のランタイムをインストールしてください。 他のOSでは、monoなどのランタイムをインストールして使用してください。
XMLファイルのパス。input.xml 出力するバイナリファイルのパス。output.bin
./xdata_conv.exe input.xml output.bin
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