2015-09-14 55 views
0

目前,我正在使用std::vector<char>这样的:C++中的动态(类型)二进制缓冲区?

char data, data2, data3; 

vec.push_back(data); 
vec.push_back(data2); 
vec.push_back(data3); 

然而,因为我存储二进制数据,有时我需要推动不同大小的数据(即,不是单个字符),我需要手动将该数据分成单个字节,这不方便或不可读。

像这样的事情将是完美的:

buffer.push<int>(some_int); // some_int = 0xAABBCCDD 
buffer.push<char>(some_char); // some_char = 0xFF 
buffer.push("arbitrary_data", arbitrary_length); 

产生的记忆是:

AA BB CC DD FF ........... 
//^int 
//  ^char 

有没有做这件事的任何标准的方式,或者我需要库/自己的实现?

+0

尽管这不是最好的方法,但您总是可以使用'std :: vector '。 – Catalin

+1

您可以使用无符号字符的向量,每当需要新项目时调整其大小,并在数组中构造该类型。 –

+0

这没有标准的方法。 'boost :: any'对于你想要做的事情来说很方便。 – user2079303

回答

0

这个怎么样?它甚至适用于非POD类型! (注:C++代码11!)

#include <new> 
#include <vector> 
#include <utility> 

class BinaryVector : public std::vector<unsigned char> { 
    public: 
     template<typename T> 
     void push(const T &what) { 
      this->resize(this->size() + sizeof(T)); 
      new(this->data() + this->size() - sizeof(T)) T(what); 
     } 

     template<typename T> 
     void push(T &&what) { 
      this->resize(this->size() + sizeof(T)); 
      new((T*)(this->data() + this->size() - sizeof(T))) T(XValue(what)); 
     } 

     template<typename T> 
     T pop() { 
      T tmp(std::move(*(T*)(this->data() + this->size() - sizeof(T)))); 
      ((T*)(this->data() + this->size() - sizeof(T)))->~T(); 
      this->resize(this->size - sizeof(T)); 

      return tmp; 
     } 
}; 
+0

创建新对象时不需要自己分配内存,并让该向量处理它。天才! – rev

+4

小心记忆对齐! [使用placement new operator时,我真的不得不担心对齐吗?](http://stackoverflow.com/a/11782277/1743220) - >是 –

0

你可以使用指针运算与reinterpret_cast结合像波纹管的例子:

std::vector<char> v; 
v.push_back('a'); 
v.push_back('b'); 
int a = 20; 
v.insert(v.end(), reinterpret_cast<char*>(&a), reinterpret_cast<char*>(&a) + sizeof(a)); 

,或者如果你有一个类/结构:

struct foo {int a = 1 , b = 2, c = 3;}; 

std::vector<char> v; 
foo b; 
v.insert(v.end(), reinterpret_cast<char*>(&b), reinterpret_cast<char*>(&b) + sizeof(b)); 
1

你要寻找的被称为序列化,它是不是ISO标准的一部分。不过,Boost确实有一个库。