什么是TLV?

TLV结构是一种传输结构,一个buf,通过T(tag)索引,通过L(len)指定后续长度,通过V(value)保存指定长度

--------------------------------------------------------------------------------------

一个buf怎么解析成TLV?

现在有这么一个二进制字节流

6F328407A0000000031010A5278701019F38129F1A029F33039F40059F1B049F09029F35015F2D086573656E667264659F110101

如第一行所示,它就是一个由上面buf解析出来的TLV结构

tag 部分是 0x6F

len 部分是 0x32

value 部分是 二进制字节流 8407A0000000031010A527870101009F38129F1A029F33039F40059F1B049F09029F35015F2D086573656E667264659F110101

---------------------------------------------------------------------------------------

TLV一层层完全解析出来是什么样的?

对于TLV来讲,有两种格式,一种是基本格式(BER-TLV),一种是嵌套格式

对于本例的buf来讲,它就是一个复合的嵌套格式,完整解析出来应该是这个样子

整个buf是一个父节点,6F

他有两个子节点84 、A5

对于84节点,他是不可再分的基础格式

对于A5节点,他是一个父节点

可以再拆分为4个子节点87、 9F38、 5F2D、 9F11

----------------------------------------------------------------------------------------

为什么87 节点和 9F38节点中间有个白色的地方呢?

根据EMV文档规定,可能出于填充或者其他原因,tlv和tlv之间可能存在无意义的00字节,

在解析的时候应该无视它

----------------------------------------------------------------------------------------

那么为什么有的元素是基础元素,有的元素是嵌套结构呢?

类似于html,有些标签需要嵌套表示更特殊的意义。

tlv也同样如此,根据文档规定,在tag 的第一个字节里面的第六位表明了它是否是一个嵌套格式

我们来看几个例子。

本例中的6F (文件控制信息(FCI)模板)二进制表示为

0110 1111

它的第六位(下划线部分)就为1

本例中的A5 (文件控制信息(FCI)专有模板)二进制表示为

1010 0101

再来一个例子 BF0C (发卡行自定义数据)二进制表示为两个字节

1011 1111  0000 1100

---------------------------------------------------------------------------------------------------

为什么有的tag有两个字节,有的tag只有一个字节?

tag的编码规则是这样子的

  • 编码规则

    • 第一个字节 bit8~bit7 表明tag所属类型

      • 00 通用级 universal class
      • 01 应用级 application class
      • 10 规范级 context-specific class
      • 11 私有级 private class
    • 第一个字节 bit6 表明本tag的value部分是否包含子tag
    • 第一个字节 bit5~bit1 表明是否有第二个字节一起表示本tag
      • 11111 全为1表示有第二个字节
    • 第二个字节 bit8 为1,同时bit7~bit1 大于0 表示有下一个tag
    • 第三~N个字节同第二个字节

举个栗子:

6F 84 A5 87

9F38 5F2D 9F11

可以看到两个字节的tag,第一个字节全是  奇数+F

在EMV中用到的tag只有两个字节

---------------------------------------------------------------------------------------------

那么len 会有两个字节吗?

当然,如果需要表示更长的内容,len就需要多字节,

因为需要控制是否有多个字节,所以第一个字节的最高一个位不能用于计数。

所以一个字节表示长度的情况,只有在value对应长度小于等于127时才会出现。

当大于127,就需要2个或更多字节记录长度。

  • 编码规则

    • 第一个字节 bit8 为1 表明本tag是用来记录后面用于表示Len的字节有多少个
    • 第一个字节 bit8 为0 即保存数值为0-127表示为长度
    • 第二个字节及后续的字节表示长度,以网络字节序表示

好了,举个栗子

本例中value部分是 0x32 二进制 是 0011 0010,

第8位为0,代表后7位表示长度,指示value长度为50字节

再举个栗子

现在有这么一个buf

704A8F01549F32030100019223BC39A45FC4937760FC611FABE5B7E1024F67D63D1E7208B952F110DB072738AE8EE7619F49159F02069F03069F1A0295055F2A029A039C019F37049F470103

解析后

7081FB9F4681F727E30864E9566480FC8DE906A9A3D28E9C5DB37556919FB4D0B8015B653F4F26F95538458ABF3A8162B20E2A46347158EB8FBF3781747015264FCE510C12FFA956486A472D964474F416B766667A7710637639D41B3FA3A5D93820E32DFD4A2FC01FB11D1C06866D8A0C5F8AEAAA401CACC59BE472B234DB09B8032CB73E8385D5C372001777B4BBCF170A05565448B72F63A4279BE692DD33817F5EF03C2689DDF3C38EB7BCCB70A17FBC64565429F4CD4DD93EC2B90D10C45E4603545D03475BB973F88FC489876E59DCDB08A40BA2D1983F3F74450EF85E51126B0B451E4C3AE22FCD33BF8D565421342FF69CE5D5914C121A8CDF2A

他的长度部分就为 81FB,意思是,第一字节表示后续用了1个字节表示长度

后续的那1个字节是FB,意味着value部分有251个字节。

好了那么现在要表示value部分长度为43981个字节

十六进制是ABCD

那么表示为TLV的L格式应该写成 0x82 AB CD

表示本次表示长度的后续字节有两个,分别是AB 和CD,凑成一起 0xABCD = 43981

EMV中 Len一般为2字节

----------------------------------------------------------------------------------------

那么value会有多个字节吗?

len都说多个字节了,那有多个字节是必须的,否则就是数据包出错了。

那么如果len表示字节数为0呢? 那么value应该不存在

EMV TLV 总结相关推荐

  1. BP-Tool 功能介绍,下载地址

    BP-Tool 是 EFTlab 公司开发的主要面向金融和智能卡的数据加解密,数据转换工具 金融领域常用算法如AES RSA DES 都能计算,还能计算DUKPT AES/DES, 以及TR31 KB ...

  2. 融系统中PBOC/EMV的TLV的算法实现(含C++/C#)

    TLV即Tag-Length-Value,常在IC卡与POS终端设备中通过这样的一个应用通信协议进行数据交换.在金融系统以及认证中,PBOC以及EMV的认证规范文档上面也有对TLV做了一些说明,由于认 ...

  3. 金融系统中PBOC/EMV的TLV的算法实现(含C++/C#)

    金融系统中PBOC/EMV的TLV的算法实现(含C++/C#) TLV即Tag-Length-Value,常在IC卡与POS终端设备中通过这样的一个应用通信协议进行数据交换.在金融系统以及认证中,PB ...

  4. C#:实现PBOC/EMV的TLV的算法(附完整源码)

    C#:实现PBOC/EMV的TLV的算法 public class TLVEntity{/// <summary>/// 标记/// </summary>public byte ...

  5. EMV技术学习和研究(九)终端行为分析

    转载请注明出处 作者:小旭 这一块的内容,我觉得文档上讲的比较清晰,而且举例也很好,所以大部分都是拷贝文档的内容过来,一边看一边分析文档的含义. 这一部分用到2类比较重要的数据,分别是 发卡行行为代码 ...

  6. EMV技术学习和研究(三)应用初始化读应用数据

    转载请注明出处 作者:小旭 借贷记和Qpboc在应用初始化和读应用数据方面的流程还是比较相似. 先看借贷记和电子现金的处理流程 应用选择完成后,终端获取到了PDOL数据(特别说明:这个不是必须的,卡片 ...

  7. EMV技术学习和研究(五)脱机数据认证之DDA

    转载请注明出处 作者:小旭 有了前面对SDA的熟悉,接下来再研究DDA就会感觉比较轻松一点了. 用于动态数据认证的数据和SDA部分所描述的一样,也是基于SFI的来组织的. 特别说明一下:之前有一个地方 ...

  8. EMV规范(八)——持卡人验证(CVM)二

    现在到了TVR和CVM Results部分了.TVR是Terminal Verification Results,也就是终端验证的结果,包括了脱机数据认证,持卡人认证,处理限制等等是否成功.所以只要交 ...

  9. 计算机tlv简介_TLV 格式及编码

    TLV 格式及编码 几乎所有的需要在卡片和终端之间传送的数据都是 TLV 格式的 . PBOC 文档里并没有对 TLV 编码细节做具体说明 , 而 EMV 的手册里虽有叙述, 但并不详细 . 我下面就 ...

  10. springmvc + jquery 错误.ClassNotFoundException: org.apache.taglibs.standard.tlv.JstlCoreTLV

    引用:http://hi.baidu.com/kohsqqtdmgafosr/item/d6ef11b40da41140ba0e12e7 spring和hibernate集成项目,在部署的时候出了很多 ...

最新文章

  1. mysql5.7 5.6从库_mysql5.7搭建主从库
  2. android phone驱动_[基础知识] 将 OneDrive 同步到 SD 卡等外部驱动器
  3. 奇迹暖暖登录一直显示服务器满,奇迹暖暖无法登录解决办法
  4. 五分钟没有操作自动退出_遇到不喜欢的小动物怎么办?教你五分钟友好的送走小动物!...
  5. Linux运维工程师必学必备的8项IT技能
  6. c++ 输入输出流关联
  7. 安装linux并卸载windows,如何在安装双启动后卸载 Windows 或者 Linux
  8. 智能循迹避障小车C语言程序编写思路,基于单片机的智能小车红外避障循迹系统设计与制作...
  9. [学习指南]运动是基于4412嵌入式技术开发板学习步骤
  10. C语言实现简单的单例模式
  11. window直接运行不需要环境的软件是什么语言开发的_C语言为何不会过时?你需要掌握多少种语言?_C 语言...
  12. MVC的自定义动作过滤器(一)
  13. 如何进入交换机配置命令窗口
  14. 对PHP中GD库的一些画图函数、及函数参数的学习总结(一)
  15. 贾玲,这次你是不是可以真的快乐了?
  16. chrome浏览器升级导致无法手动设置cookie,设置无法保存
  17. 驱动启动时遇到:打开服务失败(错误码=6):句柄无效 解决方案
  18. 移动 APP 网络优化概述
  19. 解决Mysql:Incorrect string value: '\xF0\x9F\x8D\x83\xF0\x9F...' for column
  20. NVIDIA Jetson之PWM风扇自定义控制

热门文章

  1. JSHOP2学习2:十分钟建立一个舒适的编译环境
  2. java学习之数据类型(注意点)
  3. 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?
  4. Typora安装 Pandoc实现导出功能
  5. (附源码)Springboot人体健康检测微信小程序 毕业设计012142
  6. Linux网络入侵检测软件
  7. 城市引力模型——城市经济联系度制作
  8. 使用MagicIndicator+ViewPager2出现requestLayout() improperly called by
  9. Android方法耗时监控工具
  10. SV-- event(二)