C ++相当于Java ByteBuffer?
我正在寻找Java ByteBuffer的C ++“等价物”。
我可能错过了显而易见的或只是需要一个孤立的用法示例来澄清。 我已经浏览了iostream系列,看起来它可能提供了基础。 具体来说,我希望能够:
- 从字节数组/点构建缓冲区并从缓冲区中获取基元,例如getByte,getInt
- 使用基元构建缓冲区,例如putByte,putInt,然后获取字节数组/指针。
你有stringbuf
, filebuf
或者你可以使用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
提供基本的无格式get
和write
操作来写入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。
我写了一段时间回来做你正在要求的。 试一试:
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。