2015-09-14 45 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確實有一個庫。

相關問題