C++相当于Java ByteBuffer?

2022-09-01 19:00:18

我正在寻找一个C++Java ByteBuffer的“等效物”。

我可能错过了显而易见的,或者只是需要一个孤立的用法示例来澄清。我已经浏览了iostream家族,看起来它可能提供一个基础。具体来说,我希望能够:

  • 从字节数组/点构建缓冲区,并从缓冲区获取基元,例如 getByte,getInt
  • 使用基元构建缓冲区,例如putByte,putInt,然后获取字节数组/指针。

答案 1

您有 ,或者您可以使用 。stringbuffilebufvector<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);
}

答案 2

stringstream提供基本的无格式和操作来写入字符块。专注于子类或包装它,或提供独立的模板函数来使用获取/写入适当大小的内存。getwriteT

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;
}

您可以为所需的任何其他流或矢量编写此类模板 - 在矢量的情况下,它需要使用插入而不是写入。


推荐