本文主要是介绍H5实践(3)- JS 2进制流解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
常用方案
目前比较流行的2端协议解析,比如会用 protobuf 这样的广泛支持多语言的开源库。
这样就可以省掉自己对每个消息做解析、反解析。
这里讲的是 自己解析2进制流。
c-struct
github上搜了下,接口比较人性化的,就是这个库了:
https://github.com/majimboo/c-struct
仿照C结构体定义,并提供pack、unpack接口。
用了下,这个库有几个问题:
- pack方法有bug…
- 字符串 序列化时不带长度信息。无法配合其他语言系统解析
- 不支持2进制数据类型
- 一个struct需要定义2次,可以优化掉,仅定义一次即可。
修改版本
为了能方便npm管理,并没有fork这个开源库。
而是参照其代码,重新开了个:
https://github.com/fananchong/cstruct-js
其中,暂时做了下面的事情:
- 修复pack数据错误bug
- 序列化字符串时,加带长度信息
近段时间内会把下面事情一并KO掉:
- 支持2进制数据类型
- 一个struct仅需定义1次
目前代码使用例子
(function () {
'use strict';var _ = require('c-struct');var NetMsgHead = require('../netmsg_head.js');var NetMsgMsgId = require('../netmsg_msgid.js');module.exports = ClientVertifyReq;var CMD = NetMsgMsgId.ClientVertifyReqMsgID;var structName = 'ClientVertifyReq';function ClientVertifyReq() {this.Source = 0;this.UID = 0;this.Token = "";}var _ClientVertifyReq = new _.Schema({Source: _.type.uint8,UID: _.type.uint64,Token: _.type.string(32)});_.register(structName, _ClientVertifyReq);var proto = ClientVertifyReq.prototype;proto.encode = function () {var self = this;var msgbuf = _.packSync(structName, {Source: self.Source,UID: self.UID,Token: self.Token});return Buffer.concat([new NetMsgHead(msgbuf.length, CMD).encode(), msgbuf]);};proto.decode = function (buf) {var head = new NetMsgHead(0, 0);head.decode(buf);var obj = _.unpackSync(structName, buf.slice(NetMsgHead.len));this.Source = obj.Source;this.UID = obj.UID;this.Token = obj.Token;};
})();
这篇关于H5实践(3)- JS 2进制流解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!