在协议缓冲区消息中存储二进制数据缓冲区

时间:2017-03-07 09:55:01

标签: c++ protocol-buffers

我有一个二进制数据缓冲区,我想存储在协议缓冲区中。

在文档(https://developers.google.com/protocol-buffers/docs/proto#scalar)中,它表示bytes类型相当于C ++中的string。我无法相信这一点,所以我不得不尝试它,是的,这似乎就是这种情况。

这个原型:

message BufferMsg {
  required bytes buffer = 1;
}

给出一个包含以下内容的消息定义:

private:
  ::std::string* buffer_;

public setter / getter API如下所示:

  // required bytes buffer = 1;
  inline bool has_buffer() const;
  inline void clear_buffer();
  static const int kBufferFieldNumber = 1;
  inline const ::std::string& buffer() const;
  inline void set_buffer(const ::std::string& value);
  inline void set_buffer(const char* value);
  inline void set_buffer(const void* value, size_t size);
  inline ::std::string* mutable_buffer();
  inline ::std::string* release_buffer();
  inline void set_allocated_buffer(::std::string* buffer);

当然,这不是将二进制数据存储在消息中的方法。应该怎么做?在C ++中,我通常会使用unsigned char数组或类似的东西来存储数据。

1 个答案:

答案 0 :(得分:1)

function New() { var node = document.createElement("div"); node.setAttribute("id", "new"); node.setAttribute("class", addNumber()); node.innerHTML = $("#new").html(); document.getElementById("container").appendChild(node); $('#container').append(node); } 虽然意在用于文本数据,但并不完全受其约束。它没有验证,并且通常对其缓冲区的内容没有限制。因此,如果必须,可以将其用作std::string

如果使用std::vector<char>和C风格的字符串函数来处理结果,嵌入式零只是一个问题。

主要问题是c_str()可能会在您的平台上签名,这使得使用字节类型比char更不方便。我担心这只是你必须忍受的事情。