我有一个关于std :: string和google协议缓冲库的简单问题。 我已经定义了这样的消息:
message Source
{
required string Name = 1;
required uint32 Id = 2;
optional string ImplementationDLL = 3;
optional bytes Icon = 4;
}
我想使用Icon字段发送图像,它很可能是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可能能够保存二进制数据,但是如何????
答案 0 :(得分:5)
const std::string s = icon();
const void *data=s.c_str();
答案 1 :(得分:4)
C ++字符串明确表示长度,因此they can contain binary data,包括终止C字符串的0字符。
您需要避免将字符串传递给期望C样式字符串的函数,因为它们不会处理嵌入的0字符。
答案 2 :(得分:2)
答案 3 :(得分: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();
}