アイコン/小さな画像を送信するためにプロトコルバッファを使用しました

StackOverflow https://stackoverflow.com/questions/1109602

  •  12-09-2019
  •  | 
  •  

質問

私はのstd :: stringとGoogleのプロトコルバッファライブラリに関する素朴な疑問を持っています。 私はそうのようなメッセージが定義されています:

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

私は、画像を送信するためにアイコンフィールドを使用したい、それはおそらくPNG画像になります。 いるProtobufコンパイラにこれを供給した後、私はアイコンフィールドを操作/アクセスするには、このようなものを持っています。

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 ::文字列* mutable_icon()関数は、私に頭痛を与えています。これは、STD ::文字列を返すが、私は文字列がバイナリデータを保持することはできませんと信じて!または、彼らはできますか?

私は、バイナリデータを置くことset_icon(定数無効*、size_tの)機能を使用することができますが、その後どのように私は反対側にそれを得るのですか?

私はのstd ::文字列はバイナリデータを保持することができるかもしれないと思うが、どのように????

役に立ちましたか?

解決 3

この質問への答え:あなたはどのように行います埋め込まれたヌルですか

とのstd ::文字列を構築

他のヒント

const std::string s = icon();

const void *data=s.c_str();

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

彼らは組み込み0-文字を処理しませんので、

あなたは、Cスタイルの文字列を期待して関数に文字列を渡す避けるために必要がある。

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();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top