2009-07-10 78 views
4

我有一個關於std :: string和google的協議緩衝區庫的簡單問題。 我已經定義了一個消息,像這樣:使用協議緩衝區發送圖標/小圖像

message Source 
{ 
    required string Name = 1; 
    required uint32 Id = 2; 
    optional string ImplementationDLL = 3; 
    optional bytes Icon = 4; 
} 

我想使用的圖標字段發送圖像,這很可能將是一個PNG圖像。 把這個餵給protobuf編譯器後,我得到了這樣的東西來訪問/操作Icon字段。

inline bool has_icon() const; 
inline void clear_icon(); 
static const int kIconFieldNumber = 4; 
inline const ::std::string& icon() const; 
inline void set_icon(const ::std::string& value); 
inline void set_icon(const char* value); 
inline void set_icon(const void* value, size_t size); 
inline ::std::string* mutable_icon(); 

std :: string * mutable_icon()函數讓我很頭疼。它返回一個std :: string,但我相信字符串不能保存二進制數據!或者他們可以嗎?

我可以使用set_icon(const void *,size_t)函數來放置二進制數據,但是我怎麼把它放在另一邊呢?

我認爲std :: string可能能夠保存二進制數據,但怎麼樣?

回答

4
const std::string s = icon(); 

const void *data=s.c_str(); 
3

C++串分別表示的長度明確,所以they can contain binary data,包括0個字符的終止C字符串。

您需要避免將字符串傳遞給期望C風格字符串的函數,因爲它們不會處理嵌入的0字符。

1
void String2Image(string binFile,const char* outImage) 
{ 
    fstream imgFile(outImage,ios::binary|ios::out); 

    for(int i=0; i<binFile.length(); ++i) 
    { 
     imgFile << binFile[i]; 
    } 

    imgFile.close(); 
} 
+0

這是非常低效的時間寫出來一個字節。最好只寫一次[`binFile.data()`](http://www.cplusplus.com/reference/string/string/data/)。 – poolie 2013-10-18 04:50:30