【问题标题】:Using Protocol Buffers to send icons/small images使用协议缓冲区发送图标/小图像
【发布时间】:2009-07-10 13:42:47
【问题描述】:

我有一个关于 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 可能能够保存二进制数据,但是如何 ????

【问题讨论】:

    标签: c++ stl protocol-buffers


    【解决方案1】:
    const std::string s = icon();
    
    const void *data=s.c_str();
    

    【讨论】:

      【解决方案2】:

      C++ 字符串明确表示长度,因此they can contain binary data,包括终止 C 字符串的 0 字符。

      您需要避免将字符串传递给需要 C 风格字符串的函数,因为它们不会处理嵌入的 0 字符。

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:
          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();
          }
          

          【讨论】:

          • 一次写出一个字节是非常低效的。最好一口气写binFile.data()
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-06
          相关资源
          最近更新 更多