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:由于代码较长截图不方便,所以简单说一下
网友评论