TLV 格式及编解码

JavaScript015

TLV 格式及编解码,第1张

几乎所有的需要在卡片和终端之间传送的数据都是TLV格式的.

我给你举个例子方便快速理解:

TLV 是 tag , length 和 value 的缩写.一个基本的数据元就包括上面三个域. Tag 唯一标识该数据元, length 是 value 域的长度. Value就是数据本身了. 举个例子, 下面是一个tlv格式的AID(应用标识符)字节串” 9F0607A0000000031010 ”, 其中 9F06 是tag, 07 是长度, A0000000031010 就是AID本身的值了.

对于程序编写人员来说,如果有类似上面这样的一串TLV编码的字节串从卡片传过来, 怎么样从中提取我们想要的数据. 这就牵扯出TLV解码的问题了

TLV一种可变格式,TLV的意思就是:Type类型, Lenght长度,Value值;

Type和Length的长度固定,一般那是2、4个字节;

Value的长度有Length指定;

解析方法:

1.读取type 转换为ntohl、ntohs转换为主机字节序得到类型;指针偏移+2或4

2.读取lenght,转换为ntohl、ntohs转换为主机字节序得到长度;指针偏移+2或4

3.根据得到的长度读取value,指针偏移+Length;

TLV编码就是指先对Tag编码,再对Length编码,最后对Value编码。

这个是javascript代码吧?如果是的话,需要找到不带mini的那个文件名的.js文件,那里面是完整未优化的程序代码,比较容易读,你提供的这个代码是为了节约网络传输资源的优化后版本,所有定义都变成唯一标识符了,看不出意思,没法读的。

//1.

var A = prompt("输入A的值","")

var B = prompt("输入B的值","")

var tmp = A

A = B

B = tmp

console.log("A:" + A + ",B:" + B)

//2.

var num = 1234

var str = num + ""

console.log("是" + str.length + "位数")

for(var i = str.length - 1 i >= 0 i--){

    console.log(str.charAt(i))

}

//3.

var sum = 0

for(var i = 0 i < 100 i++){

    var rand = Math.floor(Math.random() * 10)

    sum += rand

}

console.log(sum)

//4.

var A

while(true){

    A = prompt("输入一个整数","")

    if(A % 1 != 0){

        continue

    }

    var isPrime = true

    for(var i = 2 i <= A/2 i++){

        if(A % i == 0){

            isPrime = false

            break

        }

    }

    if(isPrime){

        alert(A + "是素数")

    }else{

        alert(A + "不是素数")

    }

    break

}

//5.

var n = 2,

    a = 1,

    b = 2,

    c = b / a

while (n <= 20) {

    var tmp = a

    a = b

    b = tmp + b

    c += b / a

    n++

}

console.log(c)