2

最近、私はboost :: spirit :: qiバイナリエンディアンパーサーを使用して、プラットフォームのエンディアンに依存するいくつかのバイナリデータを解析しようとしています。次のような簡単な例があります。

宣言と変数の使用:

boost :: spirit :: qi::little_wordを使用する;
boost :: spirit :: qi::little_dwordを使用する;
boost :: spirit :: qi::little_qwordを使用する;

boost :: uint16_t us;
boost :: uint32_t ui;
boost :: uint64_t ul;

リトルエンディアンのバイナリパーサーの基本的な使用法:

test_parser_attr("\x01\x02", little_word, us); assert(us == 0x0201);
test_parser_attr("\x01\x02\x03\x04", little_dword, ui); assert(ui == 0x04030201);
test_parser_attr("\x01\x02\x03\x04\x05\x06\x07\x08", little_qword, ul);
assert(ul == 0x0807060504030201LL);

test_parser("\x01\x02", little_word(0x0201));
test_parser("\x01\x02\x03\x04", little_dword(0x04030201));
test_parser("\x01\x02\x03\x04\x05\x06\x07\x08",
    little_qword(0x0807060504030201LL));

それは非常にうまく機能します。boost::uint16_tしかし、私の質問が来ます、なぜboost::uint32_tここでのようないくつかのデータ型を使用する必要があるのですか?ここで使用できますunsigned longunsigned int?また、解析doubleまたはfloatデータ型を使用する場合、どのブーストデータ型を使用する必要がありますか?そして、ブーストが上記のタイプを定義する場所を教えてください。

4

2 に答える 2

6

uint16_tやuint32_tのようなタイプが存在するため、特定のビット幅を持つ変数を宣言できます。「long」のような通常のタイプでは、アーキテクチャや実装によってサイズが異なるため、これを行うことはできません。前述の型は通常、プリプロセッサの計算によって導出され、その特定のサイズを取得するために、実装/アーキテクチャ固有の型に対するtypedefが生成されます。

于 2010-05-10T18:16:41.927 に答える
3

このファイル<boost/cstdint.hpp>には、すべてのboost::(u)int(8|16|32|64)_t定義が含まれています。これは主に、MSVC が に同梱されていないために提供されてい<cstdint>ます。C コンパイラでもある C++ コンパイラ (gcc など) では、boost 名前空間<boost/cstdint.hpp>にインポートするだけです。<cstdint>

参照: stdint.h

于 2010-05-10T18:34:38.963 に答える