`
iunknown
  • 浏览: 409523 次
社区版块
存档分类
最新评论

一个轻量的 wire format 解释器(google protobuf 的二进制格式)

阅读更多
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 方法内部使用二分查找法来加速。

分享到:
评论
2 楼 iunknown 2014-07-12  
tangfu 写道
hi,问一下,博主提供的库与pb兼容么,比如encode之后的字符串,是否能够使用protobuf的ParseFromString反序列化回来?


和 google 提供的库完全兼容,做过测试的。
1 楼 tangfu 2012-10-04  
hi,问一下,博主提供的库与pb兼容么,比如encode之后的字符串,是否能够使用protobuf的ParseFromString反序列化回来?

相关推荐

    C#版protobuf如何实现http方式二进制传输

    Protocol buffers是一种编码方法构造的一种有效而可扩展的格式的数据。 谷歌使用其内部几乎RPC协议和文件格式的所有协议缓冲区。 C#protobuf如何实现http方式二进制传输的一个例子及说明文档

    C#中使用二进制和ProtoBuf分别进行序列化、反序列化、压缩、解压缩对比测试示例源码.zip

    1. **序列化与反序列化**:创建一个对象实例,然后使用BinaryFormatter和ProtoBuf的相应方法进行序列化和反序列化。注意,ProtoBuf需要定义数据结构的.proto文件,并通过编译工具生成对应的C#类。 2. **压缩与解...

    以二进制格式序列化数据集

    `msgpack`是一个轻量级的序列化库,它基于JSON标准,但在二进制表示上更为紧凑。而`protobuf`(Protocol Buffers)是Google开发的一种数据交换的格式,它定义了一种结构化数据的串行化方法,可以用于网络通信和数据...

    protobuf 反序列化工具,输入二进制输出对应的json信息

    标题中的"protobuf 反序列化工具"指的是一个专门处理protobuf序列化数据的程序,能够将protobuf编码的二进制数据转换成易于阅读和理解的JSON格式。在网络通信中,protobuf编码的数据通常在网络抓包工具如Wireshark中...

    protobuf3.20.1-windows64

    通过protobuf,可以方便地将数据序列化为二进制格式,存储在数据库、文件系统或其他持久化存储中。这使得数据在不同系统之间传输时保持一致性和高效性。 总的来说,protobuf3.20.1-windows64是Google Protocol ...

    wire_format_lite.rar_wire_format_lite

    Wire Format Lite,作为Google开源的一个轻量级序列化库,为Linux平台提供了高效且灵活的数据交换格式。本文将深入探讨Wire Format Lite的核心概念、工作原理及其在Linux环境中的应用。 Wire Format Lite是一种简化...

    protobuf可执行文件(二进制文件)

    它能够将复杂的数据结构转换为二进制格式,以便在网络间或持久化存储时节省空间和提高传输效率。在给定的压缩包中,包含了适用于Windows操作系统(x86和X64架构)的protobuf-3.5.1版本库文件,这意味着你可以在这个...

    rawproto:从原始数据猜测Protobuf二进制文件的结构

    从原始数据猜测Protobuf二进制文件的结构 与protoc --decode_raw非常相似,但适用于javascript。 您可以基于二进制protobuf字符串使用它来对protobuf协议进行反向工程。 在查看一些示例输出(来自此仓库中的演示...

    处理二进制文件源代码

    本文将深入探讨处理二进制文件的原理和方法,并提供一个源代码示例。 一、二进制文件的结构 二进制文件通常由特定格式定义,这种格式决定了数据如何被组织和解析。例如,图片文件(如JPEG或PNG)包含图像像素数据...

    google protobuf-2.4.1

    - **序列化与反序列化**:序列化是将数据结构转化为可传输或存储的二进制格式,反序列化则是将这个二进制流还原回原来的结构。 2. **使用场景**: - **跨平台通信**:protobuf在不同的操作系统和编程语言之间交换...

    protobuf-3.5.2 协议缓冲区 - 谷歌的数据交换格式

    协议缓冲区(Protocol Buffers,简称protobuf)是谷歌推出的一种高效、灵活的数据序列化技术,它允许开发者定义数据结构,然后将这些数据结构序列化为二进制格式,以便在网络间或者持久存储中进行高效传输。protobuf...

    protobuf转为lua代码

    4. 序列化和反序列化:通过Lua代码实现protobuf消息的序列化(转换为二进制格式)和反序列化(从二进制数据恢复消息)。 通过这种方式,开发者可以利用protobuf的强大功能和Lua的便捷性,构建高效且易于维护的游戏...

    android 二进制传输 序列化

    JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也适合机器解析和生成。 4. **protobuf (Protocol Buffers)**:Google开发的一种数据序列化协议,它的性能优于JSON和XML,生成的序列化数据更小,解析速度...

    Go-各种传输二进制数据编码格式的Golang示例与比较

    - **简介**:protobuf是由Google开发的一种高效的数据序列化协议,它定义了一种结构化的数据表示方式,然后将这些数据转换为二进制格式,以减少存储和传输的开销。 - **Go中的使用**:Go的protobuf支持通过`protoc...

    google protobuf 最新源代码

    google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf 最新源代码google protobuf ...

    C# 读写二进制文件的一个示例

    下面是一个简单的二进制文件写入的示例: ```csharp using System; using System.IO; class Program { static void Main() { // 定义要写入的数据 byte[] data = new byte[] { 1, 2, 3, 4, 5 }; // 指定...

    google protobuf-3.2.0 windowsprotoc3.2.0.exe

    protobuf全称是Protocol Buffers,是由Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后将数据编码为二进制格式,用于存储或网络传输。标题中的"google protobuf-3.2.0"指的是protobuf的3.2.0版本,...

    protobuf格式解析工具

    1. 解析器:这是工具的主要部分,用于读取protobuf的二进制数据并将其转换为可读的格式。解析器可能实现了protobuf的解析算法,将原始二进制流解析为结构化的消息对象。 2. 用户界面:可能提供一个图形用户界面...

    类似 google protobuf,用于序列化/反序列化 c 结构体

    Google Protobuf(Protocol Buffers)是一种广泛使用的工具,它能够将结构化的数据模型转换成二进制格式,以便高效地在网络上传输或在磁盘上存储。然而,如果你正在寻找一个类似的解决方案,但针对C语言环境,那么...

    protobuf对象二进制序列化存储(详解)

    首先下载protobuf库,可以用Nuget。 demo: using System; namespace Tools { public class BufHelp { /// /// 对象锁 /// private readonly static Object Locker = new Object(); ///// ///// 读写...

Global site tag (gtag.js) - Google Analytics