C++/XData
をテンプレートにして作成
ホーム
検索
最終更新
ヘルプ
Wiki書式ヘルプ(整形ルール)
開始行:
* XData [#qd3fc1e2]
#contents
** はじめに [#d120ae48]
XDataとは,お手製の「XML to バイナリデータ」の仕組みのこ...
このページにはXDataに関する情報を記述します。
** 特徴 [#c3502091]
- データをXMLで記述でき,それをバイナリデータに変換できる
- エンディアンはBE,LEどちらにも対応
- 文字列は様々な文字コードの変換可能
- ラベル&リファレンス機能を使えば,データの先頭からのオ...
** XML [#fefdc08b]
*** タグ仕様 [#k8d1f586]
:要素 element|
|名前|説明|属性|子となる要素|h
|>|>|>|ルートタグ|
|xdata_root|ルートとなる要素|major_version &br;minor_vers...
|>|>|>|データ格納タグ|
|sint8 &br;sint16 &br;sint32 &br; sint64|符号有り整数デー...
|uint8 &br;uint16 &br;uint32 &br; uint64|符号無し整数デー...
|float32 &br;float64|浮動小数データを格納する要素。 &br;f...
|reference|データのオフセット位置データを格納する要素。|l...
|>|>|>|その他|
|label|データのオフセット位置を表現する要素。&br;referenc...
|align|次に設置するデータのアライメントを表現する要素。 &...
:属性 attribute|
|名前|説明|h
|major_version|XDataのXMLフォーマットのメジャー番号。|
|minor_version|XDataのXMLフォーマットのマイナー番号。|
|value|数値。有効な数値は要素によって異なる。|
|name|ラベル名。この値が1つのXML内で重複してはならない。|
|label_name|参照するラベル名。|
*** サンプル [#x9232bfe]
#code(xml,){{
<?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 --...
<float32 value="3.1415926534"/>
<float64_array count="0"></float64_array>
<float64 value="10000.2"/>
<string value="test"/>
<align value="32"/>
</xdata_root>
}}
** コンバータ [#ya7eaf59]
*** 概要 [#s3a79acf]
xdata_conv.exeは、XMLファイルをバイナリファイルに変換する...
.Netframework2.0を使用しています。Windows上で実行する場合...
他のOSでは、monoなどのランタイムをインストールして使用し...
*** コマンドラインサンプル [#ye7c62f4]
XMLファイルのパス。input.xml
出力するバイナリファイルのパス。output.bin
./xdata_conv.exe input.xml output.bin
*** コマンドラインオプション [#v02c211b]
:-endian|
- エンディアンを指定します。
- BE : ビッグエンディアン。
- LE : リトルエンディアン。(デフォルト)
:-encoding|
- stringタグで格納される文字列のエンコードを指定します。
- 例えば'utf_8','shift_jis'が入ります。
- デフォルトは'utf_8'です。
:-ignoreLabelNotFoundError|
- referenceで指定されているラベルが見つからないエラーを無...
:-silent|
- 変換情報の標準出力を切ります。
** C++ライブラリ [#h2de260a]
*** ヘッダ [#n2a53c4d]
#code(c,){{
/**
* @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 * 0x1...
};
/// XDataのヘッダ。
struct XDataHeader
{
UInt32 signature; ///< シグネチャ。Constant::SIGN...
UInt16 endian; ///< エンディアンチェッカー。Co...
UInt8 versionMajor; ///< メジャーバージョンを示す値...
UInt8 versionMinor; ///< マイナーバージョンを示す値...
UInt32 datasize; ///< ヘッダを含むデータサイズ。...
UInt32 pageCode; ///< 文字列のページコード。.net...
};
/// バイナリ形式のXDataへのアクセサ。
class XData
{
public:
/// デフォルトコンストラクタ。
XData() : ptr_(0){}
/// バイナリデータの先頭アドレスを指定して作成。
XData( const void* aPtr )
: ptr_( static_cast< const XDataHeader* >( aP...
{
}
/// 保持しているポインタを取得する。
const void* ptr()const
{
return ptr_;
}
/// 正しいXDataか。
bool isValidData()const
{
return ptr_ != 0
&& ptr_->signature == Constant::SIGNATURE
&& ptr_->endian == Constant::ENDIAN
&& ptr_->versionMajor == Constant::VERSIO...
&& 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 Refe...
{
if ( !isValidData() )
{// 無効なデータならNULLポインタを。
return 0;
}
if ( aReferenceValue < sizeof(XDataHeader) //...
|| ptr_->datasize < aReferenceValue // デ...
)
{// 範囲外
return 0;
}
return &reinterpret_cast< const UInt8* >( ptr...
}
private:
const XDataHeader* ptr_;
};
}
//-------------------------------------------------------...
#endif
// EOF
}}
終了行:
* XData [#qd3fc1e2]
#contents
** はじめに [#d120ae48]
XDataとは,お手製の「XML to バイナリデータ」の仕組みのこ...
このページにはXDataに関する情報を記述します。
** 特徴 [#c3502091]
- データをXMLで記述でき,それをバイナリデータに変換できる
- エンディアンはBE,LEどちらにも対応
- 文字列は様々な文字コードの変換可能
- ラベル&リファレンス機能を使えば,データの先頭からのオ...
** XML [#fefdc08b]
*** タグ仕様 [#k8d1f586]
:要素 element|
|名前|説明|属性|子となる要素|h
|>|>|>|ルートタグ|
|xdata_root|ルートとなる要素|major_version &br;minor_vers...
|>|>|>|データ格納タグ|
|sint8 &br;sint16 &br;sint32 &br; sint64|符号有り整数デー...
|uint8 &br;uint16 &br;uint32 &br; uint64|符号無し整数デー...
|float32 &br;float64|浮動小数データを格納する要素。 &br;f...
|reference|データのオフセット位置データを格納する要素。|l...
|>|>|>|その他|
|label|データのオフセット位置を表現する要素。&br;referenc...
|align|次に設置するデータのアライメントを表現する要素。 &...
:属性 attribute|
|名前|説明|h
|major_version|XDataのXMLフォーマットのメジャー番号。|
|minor_version|XDataのXMLフォーマットのマイナー番号。|
|value|数値。有効な数値は要素によって異なる。|
|name|ラベル名。この値が1つのXML内で重複してはならない。|
|label_name|参照するラベル名。|
*** サンプル [#x9232bfe]
#code(xml,){{
<?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 --...
<float32 value="3.1415926534"/>
<float64_array count="0"></float64_array>
<float64 value="10000.2"/>
<string value="test"/>
<align value="32"/>
</xdata_root>
}}
** コンバータ [#ya7eaf59]
*** 概要 [#s3a79acf]
xdata_conv.exeは、XMLファイルをバイナリファイルに変換する...
.Netframework2.0を使用しています。Windows上で実行する場合...
他のOSでは、monoなどのランタイムをインストールして使用し...
*** コマンドラインサンプル [#ye7c62f4]
XMLファイルのパス。input.xml
出力するバイナリファイルのパス。output.bin
./xdata_conv.exe input.xml output.bin
*** コマンドラインオプション [#v02c211b]
:-endian|
- エンディアンを指定します。
- BE : ビッグエンディアン。
- LE : リトルエンディアン。(デフォルト)
:-encoding|
- stringタグで格納される文字列のエンコードを指定します。
- 例えば'utf_8','shift_jis'が入ります。
- デフォルトは'utf_8'です。
:-ignoreLabelNotFoundError|
- referenceで指定されているラベルが見つからないエラーを無...
:-silent|
- 変換情報の標準出力を切ります。
** C++ライブラリ [#h2de260a]
*** ヘッダ [#n2a53c4d]
#code(c,){{
/**
* @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 * 0x1...
};
/// XDataのヘッダ。
struct XDataHeader
{
UInt32 signature; ///< シグネチャ。Constant::SIGN...
UInt16 endian; ///< エンディアンチェッカー。Co...
UInt8 versionMajor; ///< メジャーバージョンを示す値...
UInt8 versionMinor; ///< マイナーバージョンを示す値...
UInt32 datasize; ///< ヘッダを含むデータサイズ。...
UInt32 pageCode; ///< 文字列のページコード。.net...
};
/// バイナリ形式のXDataへのアクセサ。
class XData
{
public:
/// デフォルトコンストラクタ。
XData() : ptr_(0){}
/// バイナリデータの先頭アドレスを指定して作成。
XData( const void* aPtr )
: ptr_( static_cast< const XDataHeader* >( aP...
{
}
/// 保持しているポインタを取得する。
const void* ptr()const
{
return ptr_;
}
/// 正しいXDataか。
bool isValidData()const
{
return ptr_ != 0
&& ptr_->signature == Constant::SIGNATURE
&& ptr_->endian == Constant::ENDIAN
&& ptr_->versionMajor == Constant::VERSIO...
&& 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 Refe...
{
if ( !isValidData() )
{// 無効なデータならNULLポインタを。
return 0;
}
if ( aReferenceValue < sizeof(XDataHeader) //...
|| ptr_->datasize < aReferenceValue // デ...
)
{// 範囲外
return 0;
}
return &reinterpret_cast< const UInt8* >( ptr...
}
private:
const XDataHeader* ptr_;
};
}
//-------------------------------------------------------...
#endif
// EOF
}}
ページ名: