google 的 protobuf 项目,底层的二进制格式设计很精简,格式的详细描述参考下面的链接:
http://code.google.com/apis/protocolbuffers/docs/encoding.html
下载链接
http://spjson.googlecode.com/files/spjson-0.3.src.tar.gz
暂时是作为 spjson 的一部分。
这个格式被 google 才称为 wire format ,实质是一个用于保存 key/value 对的二进制格式。
key 被称为 fieldNumber 。
value 分为几种类型:varint,64bit,32bit,Length-delimited 。
varint 是指变长整数,实质上可能对应 int8,int16,int32,int64 和他们的有符号类型。varint 对于保存小整数有非常好的压缩效果,对于 <= 128 的整数只需要一个字节。具体的算法可以参考上面的链接。
64bit 和 32bit 按我的理解主要可能是用于映射 double 和 float 。因为整数本身已经全部可以通过 varint 来解决了。 把 double 和 float 按 little-endian byte order 进行保存。
Length-delimited 用于保存字符串和二进制数据。二进制数据可能是另外一个 protobuf ,这样就可以实现支持内嵌复杂类型的功能。
实现用典型的 codec 的方式来实现,一个 encoder 和一个 decoder 。
class SP_ProtoBufEncoder
{
public:
SP_ProtoBufEncoder( int initLen = 0 );
~SP_ProtoBufEncoder();
int addVarint( int fieldNumber, uint64_t value );
int addDouble( int fieldNumber, double value );
int addFloat( int fieldNumber, float value );
int addBinary( int fieldNumber, const char * buffer, int len );
const char * getBuffer();
int getSize();
};
class SP_ProtoBufDecoder
{
public:
SP_ProtoBufDecoder( const char * buffer, int len );
~SP_ProtoBufDecoder();
bool getNext( KeyValPair_t * pair );
bool find( int fieldNumber, KeyValPair_t * pair, int index = 0 );
};
encoder 对于不同的类型,提供了对应的 add 方法。在任何时候,都可以调用 encoder 的 getBuffer 和 getSize 获取当前已经生成的 buffer 。
decoder 提供 getNext 和 find 两个方法。getNext 用于遍历 protobuf 的所有字段。find 方法用于根据 fieldNumber 来获取对应的字段。定义了一个辅助数据结构 KeyValPair_t 来简化这个两个方法的参数。find 方法内部使用二分查找法来加速。
分享到:
相关推荐
Protocol buffers是一种编码方法构造的一种有效而可扩展的格式的数据。 谷歌使用其内部几乎RPC协议和文件格式的所有协议缓冲区。 C#protobuf如何实现http方式二进制传输的一个例子及说明文档
1. **序列化与反序列化**:创建一个对象实例,然后使用BinaryFormatter和ProtoBuf的相应方法进行序列化和反序列化。注意,ProtoBuf需要定义数据结构的.proto文件,并通过编译工具生成对应的C#类。 2. **压缩与解...
`msgpack`是一个轻量级的序列化库,它基于JSON标准,但在二进制表示上更为紧凑。而`protobuf`(Protocol Buffers)是Google开发的一种数据交换的格式,它定义了一种结构化数据的串行化方法,可以用于网络通信和数据...
标题中的"protobuf 反序列化工具"指的是一个专门处理protobuf序列化数据的程序,能够将protobuf编码的二进制数据转换成易于阅读和理解的JSON格式。在网络通信中,protobuf编码的数据通常在网络抓包工具如Wireshark中...
通过protobuf,可以方便地将数据序列化为二进制格式,存储在数据库、文件系统或其他持久化存储中。这使得数据在不同系统之间传输时保持一致性和高效性。 总的来说,protobuf3.20.1-windows64是Google Protocol ...
Wire Format Lite,作为Google开源的一个轻量级序列化库,为Linux平台提供了高效且灵活的数据交换格式。本文将深入探讨Wire Format Lite的核心概念、工作原理及其在Linux环境中的应用。 Wire Format Lite是一种简化...
它能够将复杂的数据结构转换为二进制格式,以便在网络间或持久化存储时节省空间和提高传输效率。在给定的压缩包中,包含了适用于Windows操作系统(x86和X64架构)的protobuf-3.5.1版本库文件,这意味着你可以在这个...
从原始数据猜测Protobuf二进制文件的结构 与protoc --decode_raw非常相似,但适用于javascript。 您可以基于二进制protobuf字符串使用它来对protobuf协议进行反向工程。 在查看一些示例输出(来自此仓库中的演示...
本文将深入探讨处理二进制文件的原理和方法,并提供一个源代码示例。 一、二进制文件的结构 二进制文件通常由特定格式定义,这种格式决定了数据如何被组织和解析。例如,图片文件(如JPEG或PNG)包含图像像素数据...
- **序列化与反序列化**:序列化是将数据结构转化为可传输或存储的二进制格式,反序列化则是将这个二进制流还原回原来的结构。 2. **使用场景**: - **跨平台通信**:protobuf在不同的操作系统和编程语言之间交换...
协议缓冲区(Protocol Buffers,简称protobuf)是谷歌推出的一种高效、灵活的数据序列化技术,它允许开发者定义数据结构,然后将这些数据结构序列化为二进制格式,以便在网络间或者持久存储中进行高效传输。protobuf...
4. 序列化和反序列化:通过Lua代码实现protobuf消息的序列化(转换为二进制格式)和反序列化(从二进制数据恢复消息)。 通过这种方式,开发者可以利用protobuf的强大功能和Lua的便捷性,构建高效且易于维护的游戏...
JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也适合机器解析和生成。 4. **protobuf (Protocol Buffers)**:Google开发的一种数据序列化协议,它的性能优于JSON和XML,生成的序列化数据更小,解析速度...
- **简介**:protobuf是由Google开发的一种高效的数据序列化协议,它定义了一种结构化的数据表示方式,然后将这些数据转换为二进制格式,以减少存储和传输的开销。 - **Go中的使用**:Go的protobuf支持通过`protoc...
google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf ...
下面是一个简单的二进制文件写入的示例: ```csharp using System; using System.IO; class Program { static void Main() { // 定义要写入的数据 byte[] data = new byte[] { 1, 2, 3, 4, 5 }; // 指定...
protobuf全称是Protocol Buffers,是由Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后将数据编码为二进制格式,用于存储或网络传输。标题中的"google protobuf-3.2.0"指的是protobuf的3.2.0版本,...
1. 解析器:这是工具的主要部分,用于读取protobuf的二进制数据并将其转换为可读的格式。解析器可能实现了protobuf的解析算法,将原始二进制流解析为结构化的消息对象。 2. 用户界面:可能提供一个图形用户界面...
Google Protobuf(Protocol Buffers)是一种广泛使用的工具,它能够将结构化的数据模型转换成二进制格式,以便高效地在网络上传输或在磁盘上存储。然而,如果你正在寻找一个类似的解决方案,但针对C语言环境,那么...
首先下载protobuf库,可以用Nuget。 demo: using System; namespace Tools { public class BufHelp { /// /// 对象锁 /// private readonly static Object Locker = new Object(); ///// ///// 读写...