0

ストリームで動作するライブラリで使用する必要がある関数があります。実際の入力データは、null が埋め込まれた unsigned char バッファであり、実際、各バイトは 0 ~ 255 の任意の文字/整数にすることができます。

ライブラリのソース コードがあり、それを変更できます。次のようなバイト ストリームがあるとします。

0x30, 0xb, 0x0, 0x6, 0x6

char バッファーから構築された std::istringstream ストリームを使用すると、read_stream 関数で 0x0 に達するとすぐに、peek は EOF を返しますか???

ストリームの内容をベクター ストリームにコピーしようとすると、null 文字に到達すると処理が停止します。どうすればこれを修正できますか。すべてのバイナリ文字をベクターにコピーしたい。

#include <vector>
#include <iostream>
#include <sstream>

static void read_stream(std::istream& strm, std::vector<char>& buf)
{
   while(strm) {
      int c (strm.peek());
      if(c != EOF) {    // for the 3rd byte in stream c == 0xffffffff (-1) (if using istrngstream)
         strm.get();
         buf.push_back(c);
      }
   }
}


int main() {
   char bin[] = {0x30, 0xb, 0x0, 0x6, 0x6, 0x2b, 0xc, 0x89, 0x36, 0x84, 0x13, 0xa, 0x1};
   std::istringstream strm(bin);
   std::vector<char> buf;
   read_stream(strm, buf);

   //works fine doing it this way
   std::ofstream strout("out.bin",std::ofstream::binary);
   strout.write(bin, sizeof(bin));
   strout.close();
   std::ifstream strmf("out.bin",std::ifstream::binary);
   std::vector<char> buf2;
   read_stream(strmf, buf2);


   return 0;
}

編集:

埋め込まれた null は、ストリームでは特別な意味を持たないことに気付きました。したがって、この問題は istringstream に関係しているに違いありません。

4

1 に答える 1

0

C スタイルの文字列 (charポインター) をstd::istringstreamコンストラクターに渡すと、実際には a がインスタンス化さstd::stringれ、代わりにそれが渡されます。これは、暗黙的な変換が原因で発生します。の変換コンストラクターはstd::string、C スタイル文字列のヌル バイト文字を文字列終端記号の末尾として解釈し、それ以降のすべての文字を無視します。

これを回避するstd::stringには、データのサイズを指定して明示的に構築し、それをstd::istringstream

char bin[] = {0x30, 0xb, 0x0, 0x6, 0x6, 0x2b, 0xc, 0x89, 0x36, 0x84, 0x13, 0xa, 0x1};
std::istringstream strm(std::string(bin, sizeof(bin) / sizeof(bin[0])));




注:何を達成しようとしているのか正確にはわかりませんがstd::vector、可能であれば生の文字バッファーの代わりに使用することをお勧めします。

于 2013-06-27T14:47:12.823 に答える