【发布时间】:2020-12-28 07:50:50
【问题描述】:
对于zstr, a header-only C++ zlib wrapper library,我正在尝试放气 std::string 并将其放入 std::vector<unsigned char>。
zstr::ostream deflating_stream(std::cout);
deflating_stream.write(content.data(), content.size());
上面的代码有效:它打印 Deflate'd。问题是,我不熟悉 C++ 流,也无法将其放入 std::vector。用std::ostringstream、std::ostream、std::istringstream、std::istreambuf_iterator、std::streambuf、.rdbuf() 等等尝试了几次,结果是空的输出(.tellp() == 0)。
我如何放气 std::string 并将其放入 std::vector<unsigned char>?
以下是我的一些尝试。我不知道如何访问 Deflate 的数据。
std::istringstream is;
std::ostream ss(is.rdbuf());
zstr::ostream deflating_stream(ss);
deflating_stream.write(
uncompressed_string.data(),
uncompressed_string.size()
);
the_vector.insert(
the_vector.cend(),
std::istreambuf_iterator<char>(is),
std::istreambuf_iterator<char>()
);
std::ostringstream oss;
zstr::ostream deflating_stream(oss);
deflating_stream.write(
uncompressed_string.data(),
uncompressed_string.size()
);
const std::string deflated = oss.str();
the_vector.insert(
the_vector.cend(),
deflated.cbegin(),
deflated.cend()
);
std::stringstream ss;
zstr::ostream deflating_stream(ss);
deflating_stream.write(
uncompressed_string.data(),
uncompressed_string.size()
);
std::string deflated = ss.str();
std::cout << deflated.size(); // Says 0.
【问题讨论】:
-
我有点密集。您有一个包含压缩数据的
std::string,您希望在std::vector<unsigned char>中得到解压缩数据? -
如果是这样,那么我认为您将事情复杂化了。只需从您的 zstr 流中读取字节并将字节添加到您的向量中。一个简单的循环,不需要任何花哨的流类。
-
@john,您阅读的内容是正确的。您能否告诉我如何从
ostream或其底层streambuf读取字节?抱歉,这实际上可能是微不足道的,但这确实是我失败的部分。 -
从
ostream使用类似for (char ch; str.get(ch); ) { ... }的东西。get将从输入流中读取单个字符(字节),如果读取失败(有效地)返回 false。 -
哦,等等,情况正好相反。我正在尝试压缩
std::string,未压缩的数据。