如何从 stringstream 转换为 unsigned char 向量,反之亦然?
How to convert from stringstream to unsigned char vector and vice versa?
我有 std::stringstream ss;
,其中包含我要放入 std::vector<unsigned char> my_vector;
的二进制数据。然后,我想使用 my_vector
并用它来创建一个与 ss
.
相同的新 std::stringstream new_ss
我试过做与这个问题的答案类似的事情:
Is there a more efficient way to set a std::vector from a stream?
还有这个问题:
C++: vector to stringstream
结束于:
std::copy(std::istream_iterator<unsigned char>(ss),
std::istream_iterator<unsigned char>(),
std::back_inserter(my_vector));
然后:
std::copy(my_vector.begin(),
my_vector.end(),
std::ostream_iterator<unsigned char>(new_ss));
但是ss
和new_ss
不一样。我怀疑问题可能与忽略的空格有关,所以我尝试以这种方式制作向量:
std::string const& s = ss.str();
my_vector.reserve(s.size());
my_vector.assign(s.begin(), s.end());
但这并没有解决问题。
任何有关可能出错的想法或有关解决此问题的更好方法的建议,我们将不胜感激。
使用 std::istream_iterator<T>
迭代器或 std::ostream_iterator<T>
肯定不起作用(如果输入)并且只是不必要的慢(如果输出)。问题是 std::istream_iterator<T>
跳过了前导空格,并且两个迭代器都通过格式化接口进行了各种检查,但实际上并没有帮助。
您可以使用 std::istreambuf_iterator<char>
或 std::ostreambuf_iterator<char>
。不过,我认为通过字符串接口转换更有效。
std::vector
有一个重载构造函数,它接受一对定义新向量内容序列的输入迭代器。
std::stringstream ss;
// Fill in your stringstream, then:
std::vector<unsigned char> my_vector{
std::istreambuf_iterator<char>{ss},
std::istreambuf_iterator<char>{}
};
我怀疑这将是一个相当有效的方法:
std::string const test_data = "hello world";
std::stringstream ss(test_data);
// discover size of data in stringstream
auto bof = ss.tellg();
ss.seekg(0, std::ios::end);
auto stream_size = std::size_t(ss.tellg() - bof);
ss.seekg(0, std::ios::beg);
// make your vector long enough
std::vector<unsigned char> v(stream_size);
// read directly in
ss.read((char*)v.data(), std::streamsize(v.size()));
// Now put it into a new stream object
std::stringstream new_ss;
// direct write again
new_ss.write((char const*)v.data(), std::streamsize(v.size()));
// check the result is the same as the original data
assert(new_ss.str() == test_data);
可以将这些封装到函数中以使其更容易:
std::vector<unsigned char> to_vector(std::stringstream& ss)
{
// discover size of data in stream
ss.seekg(0, std::ios::beg);
auto bof = ss.tellg();
ss.seekg(0, std::ios::end);
auto stream_size = std::size_t(ss.tellg() - bof);
ss.seekg(0, std::ios::beg);
// make your vector long enough
std::vector<unsigned char> v(stream_size);
// read directly in
ss.read((char*)v.data(), std::streamsize(v.size()));
return v;
}
std::stringstream to_stream(std::vector<unsigned char> const& v)
{
std::stringstream ss;
ss.write((char const*)v.data(), std::streamsize(v.size()));
return ss;
}
int main()
{
std::string const test_data = "hello world";
std::stringstream ss(test_data);
auto v = to_vector(ss);
auto new_ss = to_stream(v);
assert(new_ss.str() == test_data);
}
我有 std::stringstream ss;
,其中包含我要放入 std::vector<unsigned char> my_vector;
的二进制数据。然后,我想使用 my_vector
并用它来创建一个与 ss
.
std::stringstream new_ss
我试过做与这个问题的答案类似的事情:
Is there a more efficient way to set a std::vector from a stream?
还有这个问题:
C++: vector to stringstream
结束于:
std::copy(std::istream_iterator<unsigned char>(ss),
std::istream_iterator<unsigned char>(),
std::back_inserter(my_vector));
然后:
std::copy(my_vector.begin(),
my_vector.end(),
std::ostream_iterator<unsigned char>(new_ss));
但是ss
和new_ss
不一样。我怀疑问题可能与忽略的空格有关,所以我尝试以这种方式制作向量:
std::string const& s = ss.str();
my_vector.reserve(s.size());
my_vector.assign(s.begin(), s.end());
但这并没有解决问题。
任何有关可能出错的想法或有关解决此问题的更好方法的建议,我们将不胜感激。
使用 std::istream_iterator<T>
迭代器或 std::ostream_iterator<T>
肯定不起作用(如果输入)并且只是不必要的慢(如果输出)。问题是 std::istream_iterator<T>
跳过了前导空格,并且两个迭代器都通过格式化接口进行了各种检查,但实际上并没有帮助。
您可以使用 std::istreambuf_iterator<char>
或 std::ostreambuf_iterator<char>
。不过,我认为通过字符串接口转换更有效。
std::vector
有一个重载构造函数,它接受一对定义新向量内容序列的输入迭代器。
std::stringstream ss;
// Fill in your stringstream, then:
std::vector<unsigned char> my_vector{
std::istreambuf_iterator<char>{ss},
std::istreambuf_iterator<char>{}
};
我怀疑这将是一个相当有效的方法:
std::string const test_data = "hello world";
std::stringstream ss(test_data);
// discover size of data in stringstream
auto bof = ss.tellg();
ss.seekg(0, std::ios::end);
auto stream_size = std::size_t(ss.tellg() - bof);
ss.seekg(0, std::ios::beg);
// make your vector long enough
std::vector<unsigned char> v(stream_size);
// read directly in
ss.read((char*)v.data(), std::streamsize(v.size()));
// Now put it into a new stream object
std::stringstream new_ss;
// direct write again
new_ss.write((char const*)v.data(), std::streamsize(v.size()));
// check the result is the same as the original data
assert(new_ss.str() == test_data);
可以将这些封装到函数中以使其更容易:
std::vector<unsigned char> to_vector(std::stringstream& ss)
{
// discover size of data in stream
ss.seekg(0, std::ios::beg);
auto bof = ss.tellg();
ss.seekg(0, std::ios::end);
auto stream_size = std::size_t(ss.tellg() - bof);
ss.seekg(0, std::ios::beg);
// make your vector long enough
std::vector<unsigned char> v(stream_size);
// read directly in
ss.read((char*)v.data(), std::streamsize(v.size()));
return v;
}
std::stringstream to_stream(std::vector<unsigned char> const& v)
{
std::stringstream ss;
ss.write((char const*)v.data(), std::streamsize(v.size()));
return ss;
}
int main()
{
std::string const test_data = "hello world";
std::stringstream ss(test_data);
auto v = to_vector(ss);
auto new_ss = to_stream(v);
assert(new_ss.str() == test_data);
}