H5實踐(3)- JS 2進位制流解析
阿新 • • 發佈:2019-01-27
常用方案
目前比較流行的2端協議解析,比如會用 protobuf 這樣的廣泛支援多語言的開源庫。
這樣就可以省掉自己對每個訊息做解析、反解析。
這裡講的是 自己解析2進位制流。
c-struct
github上搜了下,介面比較人性化的,就是這個庫了:
仿照C結構體定義,並提供pack、unpack介面。
用了下,這個庫有幾個問題:
- pack方法有bug…
- 字串 序列化時不帶長度資訊。無法配合其他語言系統解析
- 不支援2進位制資料型別
- 一個struct需要定義2次,可以優化掉,僅定義一次即可。
修改版本
為了能方便npm管理,並沒有fork這個開源庫。
而是參照其程式碼,重新開了個:
其中,暫時做了下面的事情:
- 修復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;
};
})();