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;
    };
})();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fananchong2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值