一部のメモリからistringstream
エンコードされたものを再作成するために使用しようとしています。wstring
メモリは次のように配置されます。
- wstring エンコーディングの開始を示す 1 バイト。勝手にこれは「!」です。
- 文字列の文字長をテキスト形式で格納するための n バイト。たとえば、0x31、0x32、0x33 は「123」、つまり 123 文字の文字列になります。
- 1 バイト区切り (スペース文字)
- 文字列を構成する wchar である n バイト。wchar_t はそれぞれ 2 バイトです。
たとえば、バイト シーケンスは次のとおりです。
21 36 20 66 00 6f 00 6f 00
"!6 foo" です (ドットを使用して char 0 を表します)
私が持っているのは、pData
このエンコードされたデータを含むメモリブロックの先頭への char* ポインター (と呼びましょう) だけです。データを消費して wstring ("foo") を再構築し、ポインタをエンコードされたデータの終わりを過ぎた次のバイトに移動する「最良の」方法は何ですか?
istringstream を使用して、プレフィックス バイト、文字列の長さ、および区切り文字を消費できるようにしていました。その後、読み取るバイト数を計算し、ストリームのread()
関数を使用して、適切にサイズ変更された wstring に挿入できます。問題は、そもそもこのメモリを istringstream に入れるにはどうすればよいかということです。最初に文字列を作成してから、それを istringstream に渡すことができます。
std::string s((const char*)pData);
ただし、文字列が最初の null バイトで切り捨てられるため、これは機能しません。または、文字列の他のコンストラクターを使用して、使用するバイト数を明示的に指定することもできます。
std::string s((const char*)pData, len);
len
これは機能しますが、事前に何があるかを知っている場合に限ります。データが可変長であることを考えると、これは注意が必要です。
これは本当に解決可能な問題のようです。ストリングスとストリームの新人ステータスは、簡単な解決策を見落としていることを意味しますか? それとも、文字列全体のアプローチで間違ったツリーを吠えていますか?