js中应用protocol buffer
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。类似于XML,JSON这样的数据表示语言,ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,格式有点类似XML,可以自己定义数据格式,它是一种二进制格式允许你使用规范的语言定义一个模式。
message SearchRequest { required string query = 1; optional int32 page_number = 2; optional int32 result_per_page = 3; } |
.proto类型 | Java 类型 | C++类型 | 备注 |
double | double | double | |
float | float | float | |
int32 | int | int32 | 使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint32。 |
int64 | long | int64 | 使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint64。 |
uint32 | int[1] | uint32 | Uses variable-length encoding. |
uint64 | long[1] | uint64 | Uses variable-length encoding. |
sint32 | int | int32 | 使用可变长编码方式。有符号的整型值。编码时比通常的int32高效。 |
sint64 | long | int64 | 使用可变长编码方式。有符号的整型值。编码时比通常的int64高效。 |
fixed32 | int[1] | uint32 | 总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。 |
fixed64 | long[1] | uint64 | 总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。 |
sfixed32 | int | int32 | 总是4个字节。 |
sfixed64 | long | int64 | 总是8个字节。 |
bool | boolean | bool | |
string | String | string | 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。 |
bytes | ByteString | string | 可能包含任意顺序的字节数据。 |
optional int32 result_per_page = 3 [default = 10]; |
import "myproject/other_protos.proto"; |
详情连接:http://www.cnblogs.com/dkblog/archive/2012/03/27/2419010.html
thrift二进制 | 535 |
thrift压缩 | 473 |
protobuf | 477 |
thrift二进制 | 306034 |
thrift压缩 | 304256 |
protobuf | 177652 |
thrift二进制 | 287972 |
thrift压缩 | 315991 |
protobuf | 157192 |
<script src="js/proto/Long.min.js"></script>
<script src="js/proto/bytebuffer.js"></script>
<script src="js/proto/protobuf.js"></script>
协议用的是websocket 需要设置
//package protocol;
option java_package = "com.xingdian.seeyou.net.protocol";
enum ENCRYPT_TYPE {RC4 = 1;
};message ExchangeKeyReq {required bytes N = 1;required int32 E = 2;
}message ExchangeKeyRes {required bytes key = 1;required ENCRYPT_TYPE type = 2;
}message ExchangeKey {optional ExchangeKeyReq exchange_key_req = 1;optional ExchangeKeyRes exchange_key_res = 2;
}
这里要package protocol这个东西,后台给过来的protobuf文件中可能有这一行,我们是加载不了message的,这段文字我们一定要注释掉。对于这个message对于js比较棘手一点的可能是bytes这个数据类型了,下面会说明
//create ProtoBufif (typeof dcodeIO === 'undefined' || !dcodeIO.ProtoBuf) {throw (new Error("ProtoBuf.js is not present. Please see www/index.html for manual setup instructions."));}var ProtoBuf = dcodeIO.ProtoBuf;ExchangeKey = loadProto("exchange_key.proto","ExchangeKey");FrontendPk = ProtoBuf.loadProtoFile("proto/frontend.proto").build("FrontendPk");/*** @param {string}* @param {string}* @return {protoBuf object}*/function loadProto(fileName,objectName){return ProtoBuf.loadProtoFile("proto/"+fileName).build(objectName);}/**序列化* @return {buff}*/function createExchangeKeyReq(){crypt = new JSEncrypt( {default_key_size: 1024} );var crKey = crypt.getKey();var bytesN = crKey.n.toByteArray();var ExchangeKeyReq = loadProto("exchange_key.proto","ExchangeKeyReq");var exchangeKeyReq = new ExchangeKeyReq();exchangeKeyReq.setE(crKey.e);// 129byteexchangeKeyReq.setN((new Int8Array(bytesN,1)).buffer);var exchangeKey = new ExchangeKey();exchangeKey.setExchangeKeyReq(exchangeKeyReq);// console.log("ExchangeKey ProtoBuf对象数据:");// console.log(exchangeKey);var msgDec = exchangeKey.toBuffer();var length = msgDec.byteLength;var dataView = new DataView(new ArrayBuffer(length+8));var msgDecView = new DataView(msgDec);//setdataView.setUint32(0,length,false);dataView.setUint32(4,10000,false);for(var i = 0;i< length;i++){dataView.setUint8(i+8,msgDecView.getUint8(i));}return dataView.buffer;}/**反序列化* @param {[xhr.response]}* @return {[string]}*/function parseRc4(evt){var resBuffer = evt.data.slice(8);var resExchangeKey = ExchangeKey.decode(resBuffer);var exchangeKeyRes = resExchangeKey.getExchangeKeyRes();var rc4Key = exchangeKeyRes.getKey();var rc4KeyBase64 = rc4Key.toBase64();rc4key = crypt.decrypt(rc4KeyBase64);// console.log("decrypt RC4 Secret: "+RC4key);return rc4key;}
exchangeKeyReq.setN((new Int8Array(bytesN,1)).buffer);
后台返回的数据反序列化后结果
js中应用protocol buffer相关推荐
- python中使用 protocol buffer(Protobuf)
项目中引入proto的依赖 [两种方法]: 方法1. 官网下载对应的语言包,https://github.com/protocolbuffers/protobuf/releases 这里选择pytho ...
- Tensorflow中的Protocol Buffer
Protocol Buffer是谷歌公司开发的处理结构化数据的工具.注意这里介绍的结构化数据和大数据中的结构化数据的概念不同,这里的结构化数据指的是拥有多种属性的数据.比如一个用户:包含名字,ID,和 ...
- Android 中使用Protocol Buffer
宝宝其实是根据一老外的文章学习的,原文: https://medium.com/@elye.project/simple-android-protobuf-tutorial-with-actual-c ...
- Protocol Buffer技术详解(语言规范)
该系列Blog的内容主体主要源自于Protocol Buffer的官方文档,而代码示例则抽取于当前正在开发的一个公司内部项目的Demo.这样做的目的主要在于不仅可以保持Google文档的良好风格 ...
- Protocol Buffer基本语法
为什么使用Protocol Buffer? 在回答这个问题之前,我们还是先给出一个在实际开发中经常会遇到的系统场景.比如:我们的客户端程序是使用Java开发的,可能运行自不同的平台,如:Linux.W ...
- 快来看看Google出品的Protocol Buffer,别仅仅会用Json和XML了
前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 事实上 是 Google出品的一种轻量 & 高效的结构化数据 ...
- Netty对Protocol Buffer多协议的支持(八)
Netty对Protocol Buffer多协议的支持(八) 一.背景 在上篇博文中笔者已经用代码演示了如何在netty中使用Protocol Buffer,然而细心的用户可能会发现一个明显的不足之处 ...
- 在Java中使用Protocol Buffers
这份教程为Java开发者提供了使用 Protocol Buffer 的基本介绍.通过创建一个简单的示例应用,它展示了 在 .proto 文件中定义消息格式. 使用 Protocol Buffer 编译 ...
- 在C++中使用Protocol Buffers
下载并编译Protocol Buffer 这份教程为C++开发者提供了使用 Protocol Buffer 的基本介绍.通过创建一个简单应用,它展示了 在 .proto 文件中定义消息格式. 使用 P ...
最新文章
- 软件项目中的需求分析具体方法探讨之一
- 关于软件质量(2)- 开发 vs 测试
- 用《叩响C#之门》复习C#基础知识 第五章 枚举、结构体和数组
- Principles of Reactive Programming 之Actors are Distributed (1)
- 为什么虚拟机的linux系统IP是10.0.2.15
- SQL Server2005 ROW_NUMBER() OVER 使用
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 1 Keynote: Scott Hunter
- select 1 from 浅析
- 相对路径 ‘’,‘/’,‘./‘,‘../‘
- Assembly Essence-- 程序集深入探讨:程序集结构及部署
- jdbc增删改查有哪些步骤_JDBC打造通用增删改方法
- arcmap制作地闪密度专题图
- 九连环问题(Java)
- maya为什么不能导出fbx_maya的模型导出为OBJ,然后导入到3dmax后uv全乱了 (导出FBX更不行,导出的FBX文件放max里面基本没面了)...
- 简单的分布式矩阵乘法
- rails parameter permit
- 数据库的学习与进阶(一)
- 新闻网站爬虫及结果查询
- CTF网络安全大赛 Crypto boom
- python最优化算法实战---线性规划之内点法
热门文章
- java实现内存修改器_魔兽3内存修改器 v8
- html5 圆形加载进度条,纯css3超酷圆形Loading加载进度条特效
- ASP.NET的ADO(ActiveX Data Objects)
- mysql ignore用法_php – 在某些条件下在一列上使用MySQL IGNORE
- 把数据对象转成字符串_Android Json数据的转换
- Oracle CASE WHEN 使用及保留两位小数
- spark的朴素贝叶斯分类原理
- LKT系列加密芯片如何预置openssl生成的rsa密钥完成运算(三)
- 判断EXCEL表格某单元格值发生改变VBA代码
- 计算整数的二进制中包含1的数量