原文:https://www.cnblogs.com/utank/p/12035886.html
EMV规范中的BER-TLV数据格式:BER-TLV结构由Tag、Length、Value三部分组成。
【TAG域】
TAG可以由1个与多个字节组成,TAG域的第一个字节编码格式如下:
其中由三部分组成,高两位表示Tag类别,低五位表示Tag 编号,第6位表示Tag类型。
Tag类别:
00:通用类
01:应用类
02:上下文相关类
03:专用类
在智能卡中见得较多的是应用类与上下文相关类,通用类与行业无关,好像只有一个(0x06:Object Identifier);应用类就很多了,如前文中的0x6F,还有经常碰到的0x4F表示AID(应用标识符),在7816中定义,在其它很多的应用中就遵循了,如EMV,PBOC,GP等。
0x6F: '0110 1111'
0x4F: '0100 1111'
上下文类在特定的使用环境中意义不一样,具体可以参考相应的规范定义。专用类一般在私有的定义中出现,例如一些卡商在卡片的预个人化命令中使用。
Tag类型:
Tag的类型由第6位表示,
0:表示简单类型
1:表示结构类型
可以用一个比喻来理解两种类型的区别,简单类型相当于树形结构中的叶子节点,结构类型相当于枝干。
简单举两个例子,下面两个都是符合TLV编码的数据流:
70069F3803010203
9F3803010203
可以看到,70 TAG的值(value)域也是由TLV结构组成的。
而9F38 TAG的值域则是由简单数据构成(010203)不需要符合TLV结构编码。
基于这个原则,TLV可以设计成多层嵌套的关系。
Tag编号:
Tag编号要根据Tag的长度来确定,对于一个字节的Tag,能表示的编号为2^5为32,但全为1的时候表示有后续字节,因此一个字节的tag只能表示31个编号,大于31的只能由第多个字节表示。其后续字节格式:
实际应用中,Tag编号很少单独拿来使用;
【LEN域】
BER-TLV中的长度表示Value域中的数据长度,由1到多个字节组成。
如果首字节的最高位为0,则低7位表示长度,数据长度最大值为127。
如果首字节的最高位为1,则表明Value域中的数据长度超过127,其低7位表示后续LEN域的字节数,如下所示:
【VAL域】
值由一个或多个字节组成,根据Tag中的类型不同,有简单类型及结构类型两种表示方法。
参考引用:
https://www.cnblogs.com/highkgao/p/3968086.html
https://www.cnblogs.com/SCPlatform/p/5076935.html