1. 程式人生 > >H5實踐(3)- JS 2進位制流解析

H5實踐(3)- JS 2進位制流解析

常用方案

目前比較流行的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; }; })();