在协议缓冲区消息中存储二进制数据缓冲区
Storing binary data buffer in protocol buffer message
我有一个二进制数据缓冲区,我想将其存储在协议缓冲区中。
在文档 (https://developers.google.com/protocol-buffers/docs/proto#scalar) 中它说 bytes
类型等同于 C++ 中的 string
。我简直不敢相信,所以我不得不尝试一下,是的,情况似乎是这样..
本协议:
message BufferMsg {
required bytes buffer = 1;
}
给出包含以下内容的消息定义:
private:
::std::string* buffer_;
publicsetter/getterAPI看起来像这样:
// 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
,虽然旨在用于文本数据,但并不完全绑定到它。它不进行验证,并且通常对其缓冲区的内容没有限制。因此,如果需要,您可以将其用作 std::vector<char>
。
仅当您使用 c_str()
和 C 风格的字符串函数处理结果时,嵌入的零才会成为问题。
主要问题是 char
可能会在您的平台上签名,这使得作为字节类型使用不如 unsigned char
方便。恐怕这只是你必须忍受的事情。
我有一个二进制数据缓冲区,我想将其存储在协议缓冲区中。
在文档 (https://developers.google.com/protocol-buffers/docs/proto#scalar) 中它说 bytes
类型等同于 C++ 中的 string
。我简直不敢相信,所以我不得不尝试一下,是的,情况似乎是这样..
本协议:
message BufferMsg {
required bytes buffer = 1;
}
给出包含以下内容的消息定义:
private:
::std::string* buffer_;
publicsetter/getterAPI看起来像这样:
// 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
,虽然旨在用于文本数据,但并不完全绑定到它。它不进行验证,并且通常对其缓冲区的内容没有限制。因此,如果需要,您可以将其用作 std::vector<char>
。
仅当您使用 c_str()
和 C 风格的字符串函数处理结果时,嵌入的零才会成为问题。
主要问题是 char
可能会在您的平台上签名,这使得作为字节类型使用不如 unsigned char
方便。恐怕这只是你必须忍受的事情。