[Java ByteBuffer的C ++等效项?

问题描述 投票:22回答:6

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

我可能会丢失明显的内容,或者只需要一个单独的用法示例进行说明即可。我浏览了iostream家族,它似乎可以提供基础。具体来说,我希望能够:

  • 从字节数组/点构建缓冲区并从缓冲区中获取基元,例如getByte,getInt
  • 使用原语构建缓冲区,例如putByte,putInt,然后获取字节数组/指针。
java c++ bytebuffer
6个回答
15
投票

您有stringbuffilebuf,也可以使用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);
}

8
投票

stringstream提供基本的未格式化的getwrite操作来写入字符块。要专门研究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;
}

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


4
投票
std::vector<char> bytes;

bytes.push_back( some_val ); // put

char x = bytes[N];           // get

const char* ptr = &bytes[0]; // pointer to array

4
投票

我有一段时间写了这封信,完全可以满足您的要求。试一试:

https://github.com/RamseyK/ByteBufferCpp


3
投票

感谢所有输入,它导致了这个非常简单的解决方案:


class ByteBuffer : std::stringbuf
{
public:
    template 
    size_t get( T &out)
    {
        union coercion { T value; char data[ sizeof ( T ) ]; };

        coercion c;

        size_t s= xsgetn( c.data, sizeof(T));

        out= c.value;

        return s;
    }

    template 
    size_t put( T &in)
    {   
        union coercion { T value; char data[ sizeof ( T ) ]; };

        coercion c;

        c.value= in;

        return xsputn( c.data, sizeof(T));
    }

    size_t get( uint8_t *out, size_t count)
    {
        return xsgetn((char *)out, count);
    }

    size_t put( uint8_t *out, size_t count)
    {
        return xsputn((char *)out, count);
    }
};

使用例如:


void ByteBufferTest( void)
{
    ByteBuffer bb;

    float f= 4;
    uint8_t u8= 1;
    uint16_t u16= 2;
    uint32_t u32= 4;
    uint64_t u64= 8;

    bb.put(f);
    bb.put(u8);
    bb.put(u16);
    bb.put(u32);
    bb.put(u64);

    uint8_t array[19];

    bb.get( array, 19);

    // or

    bb.get(f);
    bb.get(u8);
    bb.get(u16);
    bb.get(u32);
    bb.get(u64);
}

1
投票

对于std :: vector更有效的是方法

push_back(T) 

您可以在这里找到更多信息:

http://www.cppreference.com/wiki/stl/vector/start

以及有关cpp stl库的一般信息

http://www.cppreference.com/wiki/stl/start

有很多容器,取决于您需要什么,

  • 快速聚合(快速写入功能)或
  • 快速阅读

看看std :: list,std :: vector。

© www.soinside.com 2019 - 2024. All rights reserved.