C ++相当于Java ByteBuffer?

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

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

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

你有stringbuffilebuf或者你可以使用vector


这是一个使用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提出的通用function。

 #include  template  std::stringbuf& put(std::stringbuf& buf, const Type& var) { buf.sputn(reinterpret_cast(&var), sizeof var); return buf; } template  std::stringbuf& get(std::stringbuf& buf, Type& var) { buf.sgetn(reinterpret_cast(&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提供基本的无格式getwrite操作来写入chars块。 专门研究T子类或包装它,或提供独立模板函数来使用get / write适当大小的内存。

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

你可以为你想要的任何其他流或向量编写这样的模板 – 在向量的情况下,它需要使用insert而不是write。

我写了一段时间回来做你正在要求的。 试一试:

https://code.google.com/p/bytebuffer-cpp/

 std::vector bytes; bytes.push_back( some_val ); // put char x = bytes[N]; // get const char* ptr = &bytes[0]; // pointer to array 

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

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

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

 push_back(T) 

你可以在这里找到更多:

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

关于cpp stl libs的一般信息

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

有很多容器,取决于你需要它,

  • 速度聚合(快速写入function)或
  • 快速阅读

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