私はC++アプリケーションを作成していますが、メモリにバイト配列を格納する従来のC++の方法が不思議でした。C++ STLの文字列バイナリデータに対応する文字列
特にバイナリデータ以外の文字列のようなものがありますか?
今はデータを格納するために* unsigned char **配列を使用していますが、STL/C++のようなものを使用する方が良いでしょう。
私はC++アプリケーションを作成していますが、メモリにバイト配列を格納する従来のC++の方法が不思議でした。C++ STLの文字列バイナリデータに対応する文字列
特にバイナリデータ以外の文字列のようなものがありますか?
今はデータを格納するために* unsigned char **配列を使用していますが、STL/C++のようなものを使用する方が良いでしょう。
std::vector<unsigned char>
を使用します。必要なほとんどの操作は、イテレータ範囲を持つSTLを使用して実行できます。また、生データが本当に必要な場合は、&v[0]
は基本配列へのポインタを与えることが保証されています。
v.data()がはっきりしているときに '&v [0]'に頼る必要はありません。 –
@LimitedAtonement実際、2009年の 'data()'は 'std :: vector'では定義されていませんでした。 –
std::string
もバイナリデータに使用できます。 std::string
のデータの長さは明示的に格納され、ヌル終了では決まっていないため、NULLバイトはstd::string
に特別な意味を持ちません。
std::string
は、で提供されていないが、バイナリデータを処理するのに便利な多くの方法を提供するため、std::vector<char>
より便利です。バイナリデータを解析/作成するには、のようなものを使用し、+
とstd::stringstream
のオーバーロードを処理すると便利です。ベクトルでは<algorithm>
のアルゴリズムを使用して同じ効果を得ることができますが、文字列メソッドよりも面倒です。 「文字のシーケンス」を実行するだけの場合は、std::string
は、これらのシーケンスに「バイナリ」データが含まれていても、通常は必要なメソッドを提供します。
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
を使用することは避けたいと思いますが、それは実践的なことではありません。
重複するhttp://stackoverflow.com/questions/441203/properway-to-store-binary-data-with-c-stl –