2009-07-10 3 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++文字列がC文字列を終端0文字を含め、そうthey can contain binary data、明示的に長さを表しています。

埋め込まれた0文字を処理しないため、文字列をCスタイルの文字列が必要な関数に渡さないようにする必要があります。

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

一度に1つのバイトをそれを書くのはかなり非効率的です。一度に['binFile.data()'](http://www.cplusplus.com/reference/string/string/data/)を書く方が良いでしょう。 – poolie

関連する問題