2009-05-07 4 views
26

私はC++アプリケーションを作成していますが、メモリにバイト配列を格納する従来のC++の方法が不思議でした。C++ STLの文字列バイナリデータに対応する文字列

特にバイナリデータ以外の文字列のようなものがありますか?

今はデータを格納するために* unsigned char **配列を使用していますが、STL/C++のようなものを使用する方が良いでしょう。

+0

重複するhttp://stackoverflow.com/questions/441203/properway-to-store-binary-data-with-c-stl –

答えて

35

std::vector<unsigned char>を使用します。必要なほとんどの操作は、イテレータ範囲を持つSTLを使用して実行できます。また、生データが本当に必要な場合は、&v[0]は基本配列へのポインタを与えることが保証されています。

+3

v.data()がはっきりしているときに '&v [0]'に頼る必要はありません。 –

+3

@LimitedAtonement実際、2009年の 'data()'は 'std :: vector'では定義されていませんでした。 –

23

std::stringもバイナリデータに使用できます。 std::stringのデータの長さは明示的に格納され、ヌル終了では決まっていないため、NULLバイトはstd::stringに特別な意味を持ちません。

std::stringは、で提供されていないが、バイナリデータを処理するのに便利な多くの方法を提供するため、std::vector<char>より便利です。バイナリデータを解析/作成するには、のようなものを使用し、+std::stringstreamのオーバーロードを処理すると便利です。ベクトルでは<algorithm>のアルゴリズムを使用して同じ効果を得ることができますが、文字列メソッドよりも面倒です。 「文字のシーケンス」を実行するだけの場合は、std::stringは、これらのシーケンスに「バイナリ」データが含まれていても、通常は必要なメソッドを提供します。

+5

またはstd :: vector lothar

+0

私はstd :: vector xian

+1

std :: vector は、その内容を/ vec(0)によって/ writable/charポインタとして取得できるという利点があります。一方、std :: stringの実装ではコピーオンライトの最適化は一般的ではありません。 – bdonlan

19

std::vector<unsigned char>またはstd::vector<uint8_t>(最新のstdint.hヘッダーがある場合)を使用してください。固定サイズのバッファで作業している場合は、unsigned char[]またはuint8_t[]を使用しても問題ありません。 std::vectorが本当に輝いているのは、バッファを頻繁に増やしたり、バッファに追加する必要がある場合です。 STLイテレータはポインタと同じセマンティクスを持っているため、STLアルゴリズムはstd::vectorと普通の古い配列でも同じように機能します。

CAdenderが指摘しているように、式&v[0]は、ベクタのバッファへのポインタを提供することが保証されています(1つの連続したメモリブロックであることが保証されています)。この保証は、C++標準の補遺に追加されました。

個人的には、私は潜在的に混乱していると思うので個人的には、std::stringを使用することは避けたいと思いますが、それは実践的なことではありません。

関連する問題