ストリームで動作するライブラリで使用する必要がある関数があります。実際の入力データは、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 に関係しているに違いありません。