美文网首页
js encode/decode---------VBS编码

js encode/decode---------VBS编码

作者: 突破格局 | 来源:发表于2018-08-25 17:17 被阅读0次

    1、对于VBS编码可能很多人比较陌生,但对于Json编码并不陌生。VBS是一种类于Json的编码格式,下面是熊家贵老师关于VBS的介绍: https://github.com/halftwo/knotty/blob/master/doc/vbs.rst。参考熊家贵老师用go语言实现的VBS编码写出了对应js版本的VBS编码,代码地址: https://github.com/ying2025/VBS-encode-decode
    2、对外提供接口:
    encodeVBS(u), Param: u (将要编码的对象),对外输出ArrayBuffer
    decodeVBS(u, j), Param: u (将要解码的对象),j(解码开始位置),对外输出对应的数据和解码结束位置。
    3、文件功能简述:
    float.js 文件: 主要提供了浮点数按照IEEE754标准拆分出e,m,sign和将e,m,sign组装成浮点数。
    kind.js文件: 主要是各种数据类型在VBS编码的标志。
    limit.js文件: 主要是最大值限制。
    encode.js文件: 主要是对各种数据类型进行编码。
    commonFun.js文件: 主要存放公共函数。
    4、主要函数说明:
    a、Encode
    VbsEncode: 对各种数据类型具体编码。包括整型、浮点数、字符串、布尔、空、undefined、二进制、数组、对象。
    vbsStringify:判断要编码的数据类型,根据对应的类型去编码。
    encodeVBS: 将数据进行编码,并将其转为ArrayBuffer。
    b、Decode
    VbsDecoder: 对各种数据类型具体解码。包括整型、浮点数、字符串、布尔、空、undefined、二进制、数组、对象。

    5、VbsEncode内部函数说明:
    encodeInterger: 传入参数value有正负数之分,对于正负数编码不同
    _packIntOrStringHead: 传入_intShift参数特殊说明:n + len,因为浮点数对e编码采用整数时this..bp已经有值,所以需要从this.bp,length以后的位置编码。


    image.png

    _intShift: 因为js只能进行32位以内的位操作,所以超出32位无法进行位操作,所以这里采用字符串方式操作。将一个数转为二进制后通过字符串超过7位的,遍历截取7位,将最高位置为1转为10进制,放入数组中。少于7位时直接将其最高位置为1。


    image.png
    encodeFloat: 将浮点数value分割为expo和mantissa, 其中mantissa包含着value的符号,mantissa采用 浮点数编码,expo采用整数编码方式。
    image.png
    encodeBool: 将标识编码
    encodeBlob: 将标识和二进制长度编码,将二进制数据写入到数组中。
    image.png

    encodeString: 将字符串转为对应的ASCII码,然后将其类型和长度编码。


    image.png
    encodeArray: 递归调用vbsStringify对value中每个元素进行编码,然后将头部和尾部加入。
    image.png
    encodeObject: 对value编码,加上头部和尾部标识
    _packObject: 对value的k和v分别编码。
    image.png
    6、vbsDecode主要函数明:
    decodeObj:解析入口,通过this._unpackHead() 函数解析出head,其中head包含kind、num、describe。根据kind进行对应的解码。
    image.png
    _getStr: 解码字符串,从startPos处开始将ASCII码转为对应的字符串。
    image.png
    _getBlob:解码二进制,this.dec.encodeData为Uin8Array类型,this.dec.encodeData.buffer将其转为ArrayBuffer,Uint8Array提供如下图所示的函数,可以直接将其二进制数组。
    image.png

    _decodeArray:解析数组,循环解析每个元素,如果不是数组的结尾,则调用this.decodeObj解析出对应的数据。


    image.png
    _decodeKV: 解析对象,循环解析每一个对象,如果不是对象结尾则调用decodeObj分别解析出k和v,然后组装出对象。
    image.png
    _unpackHead:由于代码较长截图不方便,所以简单说一下

    相关文章

      网友评论

          本文标题:js encode/decode---------VBS编码

          本文链接:https://www.haomeiwen.com/subject/wwsgiftx.html