本文是自身在研究学习过程中碰到的问题,整理而成。

为了便于后文的引用说明,先列出一段TLV结构的数据:

[6F] 4D
│ ├─[] A0000003330101
│ ├─[A5]
│ │ ├─[] 0B 50424F4320437265646974
│ │ ├─[]
│ │ ├─[9F38] 9F33039F4E14
│ │ ├─[5F2D] 7A68656E66726465
│ │ ├─[9F11]
│ │ ├─[9F12] 0F 4341524420494D4147452030303031
│ │ ├─[BF0C]
│ │ │ └─[9F4D] 0B0A
  • BER-TLV数据对象结构

  • Tag(标记)

根据ISO/IEC 8825-1(doc88上可以查看较早版本 )规范的定义,BER-TLV结构由Tag、Length、Value三部分组成;

Tag可以由1个与多个字节组成,如下图所示:

其中最为主要的是首字节,由三部分组成,高两位表示类别,低五位表示TagNumber,第6位表示类型;

  • Tag类别

首字节的解析EMV规范中的一张图说明很详细,国内也可以参考PBOC规范。

由上图可以看出,高两位表示的四种类别,分别为:

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:表示结构类型

可以用一个比喻来理解两种类型的区别,简单类型相当于树形结构中的叶子节点,结构类型相当于枝干。例如如下的数据中,

84、50、87等处在叶子节点上的tag就表示简单类型,而6F、A5等表示结构类型。用二进制表示更为直观理解。

0x6F: '010 1111'

0x50: '011 0000'

  • Tag编号

Tag编号要根据Tag的长度来确定,对于一个字节的Tag,能表示的编号为2^5为32,但全为1的时候表示有后续字节,

因此一个字节的tag只能表示31个编号,大于31的只能由第多个字节表示;

在平常使用中感觉很少碰到,只在JavaCard的一个demo中使用过(说到这里顺便提下,在JavaCard提供的API中,

有一个包专门为TLV提供数据打包与解析。但在使用过程中碰到一个问题,类似前文中例子中的9F11这个Tag解析不了)。

如上图所示,根据解析得到TAG9F11的Tag编号为0x11,个人理解此处的0x10应该表示的编号为(0x11+31)。

  • Length(长度)

BER-TLV中的长度表示Value域中的数据长度,由1到多个字节组成,如果首字节的最高位为0,则低7位表示长度,

最大值为0x7F,Value数据长度大于128个字节则Length都由3个字节表示。对于超过256字节较少见到,

JavaCard中的下载文件时使用的Tag经常用到,扩展APDUs可能用到。

  • Value(值)

值由一个或多个字节组成,根据Tag中的类型不同,有简单类型及结构类型两种表示方法,如本文最开始提供的数据中,

tag6F的数据长度为0x4D,值域为后面所有的数据。

BER-TLV数据结构的更多相关文章

  1. OC封装的TLV数据格式解析库

    作者:朱克锋 邮箱:zhukefeng@iboxpay.com 转载请注明出处:http://blog.csdn.net/linux_zkf TLV是一种可变格式,意思就是: Type类型, Leng ...

  2. SNMP ber 编码

    5.1 标识域(tag)的编码规则 标识域指明数据的类型,占用1个字节,常见的类型有:BOOL(0x01);INT(0x02);OCTSTR(0x04);NULL(0x05);OBJID(0x06); ...

  3. TLV格式是什么格式

    TLV 格式是什么格式 一种可变格式, TLV 的意思就是: Type 类型, Lenght 长度, Value 值: Type 和 Length 的长度固定,一般那是 2 . 4 个字节: Valu ...

  4. EMV/PBOC解析(三) TLV格式解析(C#)

    1.什么是TLV格式? TLV即Tag-Length-Value,常在IC卡与POS终端设备中通过这样的一个应用通信协议进行数据交换. 金融系统中的TLV是BER-TLV编码的一个特例编码规范,而BE ...

  5. Redis 基础数据结构与对象

    Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包 ...

  6. Redis中的数据结构

    1. 底层数据结构, 与Redis Value Type之间的关系 对于Redis的使用者来说, Redis作为Key-Value型的内存数据库, 其Value有多种类型. String Hash L ...

  7. PKI中常用编码:ASN.1 DER BER Base64

    迟到了两年的笔记... 在PKI的应用中,常会用到以下几个编码概念: ASN.1(Abstract Syntax Notation One, 抽象语法标记) 定义:A standard interfa ...

  8. 序列化之 TLV

    目录 序列化之 TLV 1. 紧凑模式 2. 可扩展性 3. 更好的可扩展性 4. 自解释性 5. 跨语言特性 6. 代码自动化:IDL语言 7. 总结 序列化之 TLV 通信协议可以理解两个节点之间 ...

  9. TLV通信协议

    基础 TLV协议是BER编码的一种,全称是Tag.length.value.该协议简单高效,能适用于各种通信场景,且具有良好的可扩展性.TLV协议的基本格式如下: 其中,Tag占2个字节,是报文的唯一 ...

  10. 2020-06-13:Redis底层数据结构?

    福哥答案2020-06-13: 福哥口诀法:简链字跳整 压快压 SDS simple synamic string:简单动态字符串.支持自动动态扩容的字节数组 .list :链表 .双端链表.dict ...

随机推荐

  1. c语言:矩阵相乘-矩阵相加 新手练习1

    #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> voi ...

  2. C语言判断字符串是否旋转过

    //方法一 //每次左旋一次,判断旋转之后字符串是否与目标字符串是否一致 //旋转一圈 没有找到返回0 #define _CRT_SECURE_NO_WARNINGS #include<stdi ...

  3. JZ2440开发板:用按键点亮LED灯(学习笔记)

    本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读. 想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作.阅读JZ2440的原理图,可以 ...

  4. 解决WinScp连接被拒绝的问题

    尝试以下方法: 1) 开启|关闭防火墙(这里需要关闭) sudo ufw enable|disable 2) 开启远程服务 在终端界面输入:service sshd start.结果显示:ssh:un ...

  5. 第二节 双向链表的GO语言实现

    一.什么是双向链表 和单链表比较,双向链表的元素不但知道自己的下线,还知道自己的上线(越来越像传销组织了).小煤车开起来,图里面可以看出,每个车厢除了一个指向后面车厢的箭头外,还有一个指向前面车厢的箭 ...

  6. [Cracking the Coding Interview] 4.1 Route Between Nodes 节点间的路径

    Given a directed graph, design an algorithm to find out whether there is a route between nodes. 这道题让 ...

  7. JavaSE思维导图

    Java基础知识:  面向对象:  集合:  多线程.网络编程.反射.设计模式:  常用API:  转载 https://blog.csdn.net/qq_34983808/article/detai ...

  8. ARP级ping命令:arping

    一.工作原理 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议,是网络链路层的协议,在局域网中使用.主机发送信息时将包 ...

  9. BZOJ1588_营业额统计_KEY

    题目传送门 分析题意可得,希望求与每个数最相近的数. 二叉搜索树的简单题,因为可能被卡成O(N),考虑平衡树. 因为Treap较简单,此处用Treap编写代码. code: #include < ...

  10. 电子质检报告系统v3.8

    南京转折点信息是太阳升软件全资子公司,一家专业从事医药软件开发的医药软件企业. 根据新版GSP支持医药企业药品质检报告电子化的要求及国家药监局的解释:供货商提供的加盖企业电子印章的电子药品检验报告与纸 ...