我有一个我需要在一个使用流的库中使用的函数。实际的输入数据是带有嵌入空值的无符号字符缓冲区,实际上每个字节可以是0-255之间的任何字符/整数。
我有库的源代码,可以更改它。给定像这样的字节流:
0x30, 0xb, 0x0, 0x6, 0x6
如果我使用从char缓冲区构造的std :: istringstream流,只要在read_stream函数中达到0x0,peek就会返回EOF ???
当我尝试将流的内容复制到矢量流时,处理在到达空字符时停止。我怎样才能解决这个问题。我想将所有二进制字符复制到矢量。
#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;
}
编辑:
我现在意识到,embeeded null在流中没有特殊意义。所以这个问题必须与istringstream有关。
答案 0 :(得分:0)
将C样式字符串(char
指针)传递给std::istringstream
constructor它实际实例化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
而不是原始字符缓冲区。 < / p>