您的位置:首页 > Web前端 > JavaScript

H5实践(3)- JS 2进制流解析

2018-03-27 18:31 218 查看

常用方案

目前比较流行的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;
};
})();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息