我有一个二进制数据缓冲区,我想存储在协议缓冲区中。
在留档(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中,我通常使用无符号字符数组或类似的东西来存储数据。
string虽然用于文本数据,但并没有完全绑定到它。它不进行验证,并且通常对其缓冲区的内容没有限制。所以可以将其用作std::vector
只有当您使用c_str()
和C样式字符串函数处理结果时,嵌入式零才是问题。
主要问题是,可能在您的平台上对字符进行了签名,这使得作为字节类型进行处理不如作为无符号字符进行处理方便。恐怕这正是你必须忍受的。
问题内容: 我有重复的消息,我想存储在一个文件中。目前,我必须将此重复消息包装在另一条消息中。有没有解决的办法? 问题答案: 这是协议缓冲区文档的“技术”部分对重复消息的说明: 如果要将多个消息写入单个文件或流,则由您来跟踪一条消息的结尾和下一条消息的开始。协议缓冲区连线格式不是自定界的,因此协议缓冲区解析器无法确定消息在何处结束。解决此问题的最简单方法是在编写消息本身之前先编写每个消息的大小。当
试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地
我发现了一个有趣的协议缓冲区问题。如果您有两条类似的消息,那么可以使用C API或命令行解析其中一条消息,就像解析另一条消息一样。 ParseFromString的有限文档没有提到它不需要使用所有字符串,如果不使用,它也不会失败。 我原以为ParseFromString无法解析类型为a的消息,如果它显示的是类型为B的消息。毕竟消息包含了额外的数据。然而,事实并非如此。示例脚本演示了该问题: 输出为
两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?
问题内容: 在Python中,您可以将StringIO用作字符数据的文件状缓冲区。内存映射文件基本上对二进制数据执行类似的操作,但是它需要一个用作基础的文件。Python是否有一个用于二进制数据且仅是内存的文件对象,相当于Java的ByteArrayOutputStream? 我的用例是我想在内存中创建一个ZIP文件,而ZipFile需要一个类似文件的对象。 问题答案: 您可能正在寻找io.Byt
问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa