2017-03-07 230 views
0

我有一個二進制數據緩衝區,我想要存儲在協議緩衝區中。在協議緩衝區消息中存儲二進制數據緩衝區

在文檔(https://developers.google.com/protocol-buffers/docs/proto#scalar)中,它表示bytes類型等同於C++中的string。我簡直不敢相信這個,所以我不得不去試一下,是的,這似乎是這樣..

這原:

message BufferMsg { 
    required bytes buffer = 1; 
} 

給出包含此消息的定義:

private: 
    ::std::string* buffer_; 

公共setter/getter API如下所示:

// required bytes buffer = 1; 
    inline bool has_buffer() const; 
    inline void clear_buffer(); 
    static const int kBufferFieldNumber = 1; 
    inline const ::std::string& buffer() const; 
    inline void set_buffer(const ::std::string& value); 
    inline void set_buffer(const char* value); 
    inline void set_buffer(const void* value, size_t size); 
    inline ::std::string* mutable_buffer(); 
    inline ::std::string* release_buffer(); 
    inline void set_allocated_buffer(::std::string* buffer); 

當然,這不能用來存儲二進制數據的方式 一個消息。應該怎麼做?在C++中,我通常會使用unsigned char數組或類似的東西來存儲數據。

+0

_「當然,這不可能是將二進制數據存儲在消息中的方式,應該怎麼做?」_您最關心的是什麼?我用它,它工作正常。 –

+0

在std :: string中存儲零值沒有問題嗎? – Martin

+0

不存在將''\ 0''存儲在'std :: string'中的問題。長度是獨立跟蹤的。 –

回答

1

std::string儘管意圖用於文本數據,但並不完全綁定它。它沒有驗證,並且通常對其緩衝區的內容沒有任何限制。因此,如果必須,您可以將其用作std::vector<char>

如果您使用c_str()和C風格的字符串函數來處理結果,則嵌入的零是唯一的問題。

主要問題是char可能會在您的平臺上進行簽名,這使得使用字節類型比unsigned char更不方便。恐怕這只是你必須忍受的事情。