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

一个轻量的 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方式二进制传输的一个例子及说明文档

    protobuf3.20.1-windows64

    protobuf库,3.20.1版本,适用于windows64位系统,数据传输协议相关

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

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

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

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

    google protobuf 最新源代码

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

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

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

    testProtobufjs:用ProtoBuf.js将JSON数据缓存转成二进制缓存

    用ProtoBuf.js将JSON数据缓存转成二进制缓存 edit by Seven on 2015-05-31 项目介绍 安装 npm install 转换 node main 测试 node server 各程序功能 main.js 用来将 hour.json 转成 www/hour.bin 。 server.js 用...

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

    支持windowos的x86以及X64的protobuf-3.5.1库文件,已经编译好了,包括头文件,以及库文件,还有protoc编译器

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

    各种传输二进制数据编码格式的Golang示例与比较。protobuf vs bson vs json vs xml

    google protobuf的应用

    服务器端与客户端通信,使用google protobuf作为交互数据的序列化工具,其中客户端使用select机制实现I/O复用,服务端使用epoll机制,提高并发连接时的处理效率。软件环境:linux。文件dealpack.cc是服务端和客户端...

    Google ProtoBuf 使用说明

    Google ProtoBuf 安装使用说明

    谷歌protobuf代码生成工具

    protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台 提供了多种语言的实现:java、c#、c++、go 和 python,是一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络...

    wireshark-win32-1.8.6-protobuf

    支持google protocol buffer协议的wireshark...2. 支持TCP,需要固定包头+protobuf二进制负载内容。 包头长度不包含自身,只包含protobuf二进制内容的长度。 包头长度为固定的4个字节。 3. 支持大量的消息嵌套。。

    Windows环境使用google protobuf实现简单的例子

    windows下vs环境对protobuf的简单应用,所用vs版本2010,protobuf版本protobuf-2.5.0

    Protobuf RPC是一种基于TCP协议的二进制RPC通信协议的Java实现.zip

    Protobuf RPC是一种基于TCP协议的二进制RPC通信协议的Java实现

    protobuf 3.5.0

    由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件...

    protobuf 3.5.1

    由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件...

    google protobuf

    What ’ s the protocolbuffer? protocolbuffer 是google 的一种数据交换的格式,它独立于语言,独立于...作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如 网络传输 、配置文件、数据存储等诸多领域

    protobuf工具

    protobuf是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比...

    Google.Protobuf.dll

    Google.Protobuf.dll,C#用protobuf类库,用于生成和解析二进制文件 需要通过固定的proto文件格式成C#类

Global site tag (gtag.js) - Google Analytics