24 BK.TLV

优质
小牛编辑
133浏览
2023-12-01

[Tag][Length][Value],其中Tag占2字节 length占2个字节,当使用构造函数申请空间时,则需申请 数据个数 *(4+各个数据类型长度)个字节。

方法

构造函数

new BK.TLV(n)

参数类型名称备注
nnumber数据长度

返回值:

类型名称备注
ObjectBK.TLV

例子:

var sendTlv = new BK.TLV(sendStr.length+4);

new BK.TLV(buff)

参数类型名称备注
buffObject数据缓存

返回值:

类型名称备注
ObjectBK.TLV

例子:

var recvTlv = new BK.TLV(recvBuffer);

解析 bkJSParseTLV() / parseTLV()

参数:无

返回值:

类型名称备注
Object解析结果

例子:

var result = recvTlv.bkJSParseTLV();
for (var key in result) {
    if (result.hasOwnProperty(key)) {
        var element = result[key];
        BK.Script.log(0,0,"key = " +  key + " element = "+element);
    }
}

从tlv中取出buff bkJSTLVGetBuffer() / getBuffer()

参数:无

返回值:

类型名称备注
ObjectBK.Buffer对象

例子:

var recvBuffer = sendTlv.bkJSTLVGetBuffer();

获取tlv长度 bkJSTLVGetLength() / getLength()

参数:无

返回值:

类型名称备注
numbertlv长度

例子:

var len = sendTlv.bkJSTLVGetLength();

写数据

使用方法和BK.Buffer相似

  • bkJSTLVWriteInt8 / writeInt8
  • bkJSTLVWriteInt16 / writeInt16
  • bkJSTLVWriteInt32 / writeInt32
  • bkJSTLVWriteInt64 / writeInt64
  • bkJSTLVWriteUInt8 / writeUInt8
  • bkJSTLVWriteUInt16 / writeUInt16
  • bkJSTLVWriteUInt32 / writeUInt32
  • bkJSTLVWriteUInt64 / writeUInt64
  • bkJSTLVWriteFloat / writeFloat
  • bkJSTLVWriteDouble / writeDouble
  • bkJSTLVWriteBuffer / writeBuffer

TLV支持的类型:

TLVType = {
  Int8 : 0x21,
  Uint8 : 0x22,
  Int16 : 0x21,
  Uint16 : 0x24,
  Int32 : 0x25,
  Uint32 : 0x26,
  Int64 : 0x27,
  Uint64 : 0x28,
  Byte : 0x29,
  Double : 0x2a,
  Float : 0x2b,
  Int8Repeated : 0x31,
  Uint8Repeated : 0x32,
  Int16Repeated : 0x33,
  Uint16Repeated : 0x34,
  Int32Repeated : 0x35,
  Uint32Repeated : 0x36,
  Int64Repeated : 0x37,
  Uint64Repeated : 0x38,
  ByteRepeated : 0x39,
  DoubleRepeated : 0x3a,
  FloatRepeated : 0x3b
}

TLV作为数据发送 / 接收:

// ------- 作为数据发送 ------- 
var sendStr = "message";
var sendTlv = new BK.TLV(sendStr.length+4);

//写入一个String,标记为2
var sendBuf = new BK.Buffer(sendStr.length);
sendBuf.writeAsString(sendStr);
sendTlv.bkJSTLVWriteBuffer(sendBuf,TLVType.Byte,2);

// 假装经过了网络传输
var recvBuffer = sendTlv.bkJSTLVGetBuffer();

// ------- 作为数据接收 ------- 
var recvTlv = new BK.TLV(recvBuffer);
//解析
var result = recvTlv.bkJSParseTLV();
for (var key in result) {
  if (result.hasOwnProperty(key)) {
    var element = result[key];
    BK.Script.log(0,0,"key = " +  key + " element = "+element);
  }
}

//根据标记读取数据
var value = result.tag2;
var recvStr = value.readAsString();

示例代码:Res/script/demo/basics/tlv_demo.js