C++相当于Java ByteBuffer?
2022-09-01 19:00:18
我正在寻找一个C++Java ByteBuffer的“等效物”。
我可能错过了显而易见的,或者只是需要一个孤立的用法示例来澄清。我已经浏览了iostream家族,看起来它可能提供一个基础。具体来说,我希望能够:
- 从字节数组/点构建缓冲区,并从缓冲区获取基元,例如 getByte,getInt
- 使用基元构建缓冲区,例如putByte,putInt,然后获取字节数组/指针。
我正在寻找一个C++Java ByteBuffer的“等效物”。
我可能错过了显而易见的,或者只是需要一个孤立的用法示例来澄清。我已经浏览了iostream家族,看起来它可能提供一个基础。具体来说,我希望能够:
您有 ,或者您可以使用 。stringbuf
filebuf
vector<char>
这是一个使用的简单示例:stringbuf
std::stringbuf buf;
char data[] = {0, 1, 2, 3, 4, 5};
char tempbuf[sizeof data];
buf.sputn(data, sizeof data); // put data
buf.sgetn(tempbuf, sizeof data); // get data
感谢@Pete Kirkham对泛型函数的想法。
#include <sstream>
template <class Type>
std::stringbuf& put(std::stringbuf& buf, const Type& var)
{
buf.sputn(reinterpret_cast<const char*>(&var), sizeof var);
return buf;
}
template <class Type>
std::stringbuf& get(std::stringbuf& buf, Type& var)
{
buf.sgetn(reinterpret_cast<char*>(&var), sizeof(var));
return buf;
}
int main()
{
std::stringbuf mybuf;
char byte = 0;
int var;
put(mybuf, byte++);
put(mybuf, byte++);
put(mybuf, byte++);
put(mybuf, byte++);
get(mybuf, var);
}
stringstream
提供基本的无格式和操作来写入字符块。专注于子类或包装它,或提供独立的模板函数来使用获取/写入适当大小的内存。get
write
T
template <typename T>
std::stringstream& put ( std::stringstream& str, const T& value )
{
union coercion { T value; char data[ sizeof ( T ) ]; };
coercion c;
c.value = value;
str.write ( c.data, sizeof ( T ) );
return str;
}
template <typename T>
std::stringstream& get ( std::stringstream& str, T& value )
{
union coercion { T value; char data[ sizeof ( T ) ]; };
coercion c;
c.value = value;
str.read ( c.data, sizeof ( T ) );
value = c.value;
return str;
}
您可以为所需的任何其他流或矢量编写此类模板 - 在矢量的情况下,它需要使用插入而不是写入。