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

4 に答える 4

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

const void *data=s.c_str();
于 2009-07-10T13:52:12.350 に答える
4

C++ 文字列は長さを明示的に表すため、C 文字列を終了する 0 文字を含むバイナリ データを含めることができます。

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

于 2009-07-10T13:59:23.977 に答える
2

この質問への答え: null が埋め込まれた std::string をどのように作成しますか?

于 2009-07-10T16:04:23.550 に答える
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();
}
于 2011-03-18T03:13:38.777 に答える