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

Posted

技术标签:

【中文标题】在协议缓冲区消息中存储二进制数据缓冲区【英文标题】:Storing binary data buffer in protocol buffer message 【发布时间】:2017-03-07 09:55:00 【问题描述】:

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

在文档 (https://developers.google.com/protocol-buffers/docs/proto#scalar) 中,它说 bytes 类型等同于 C++ 中的 string。我简直不敢相信,所以我不得不尝试一下,是的,这似乎是这样..

这个原型:

message BufferMsg 
  required bytes buffer = 1;

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

private:
  ::std::string* buffer_;

公共 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 数组或类似的东西来存储数据。

【问题讨论】:

“当然,这不可能是在消息中存储二进制数据的方式。应该怎么做?” 您有什么顾虑?我用过,效果很好。 std::string 中存储零没有问题吗? 不,将'\0' 存储在std::string 中从来没有问题。长度是独立跟踪的。 【参考方案1】:

std::string,虽然用于文本数据,但并不完全绑定到它。它不进行验证,并且通常对其缓冲区的内容没有限制。因此,如果需要,您可以将其用作std::vector<char>

仅当您使用 c_str() 和 C 风格的字符串函数来处理结果时,嵌入的零才会成为问题。

主要问题是char 可能在您的平台上签名,这使得作为字节类型使用不如unsigned char 方便。恐怕这只是你必须忍受的事情。

【讨论】:

我应该将字节复制到字符串还是只使用 set_mybuffer()?

以上是关于在协议缓冲区消息中存储二进制数据缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

如何解码二进制/原始谷歌 protobuf 数据

Node基础_Buffer缓冲区

Node.js Buffer(缓冲区)

Node.js Buffer(缓冲区)

Node.js:Buffer(缓冲区)介绍及常用方法

Node.js实战对于Buffer和Stream模块系统的深入剖析