协议茶馆:TLV 格式及编码

2024-01-04

​本篇是多年前的存篇,出处不详。旧酒换新瓶,温故知新,有了新的理解。

一、什么是 TLV 格式

几乎所有的通信都有协议,而几乎所有的需要在卡片和终端之间传送的数据(结构)都是 **TLV** 格式的.

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

二、 TLV 格式编码解析

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

解析方法:

  • 1.读取type 转换为ntohl、ntohs转换为主机字节序得到类型;指针偏移+2或4
  • 2.读取lenght,转换为ntohl、ntohs转换为主机字节序得到长度;指针偏移+2或4
  • 3.根据得到的长度读取value,指针偏移+Length;
    1. 继续处理后面的tlv;

TLV编码 就是指先对 Tag 编码,再对 Length 编码,最后对 Value 编码。BER编码的长度确定的编码方式就是这样的。

2.1 BER-TLV 编码 : 长度确定与长度不确定的编码方式

BER编码 有两种方式:

  • 一种是 长度确定的编码方式 。这由3部分组成 Identifier octets Length octets Contents octets (可以和TLV对应)。
  • 另一种是 长度不确定的编码方式 。这由4部分组成 Identifier octets Length octets Contents octets End-of-contents octets 。其中 Length octets 为0x80,End-of-contents octets为0x00 00。每种类型都能够编码成长度确定的编码方式,但是有的类型不能够编码成长度不确定的编码方式。

2.2 DER-TLV 编码 : 只能使用长度确定的编码方式

  • Identifier octets 由3部分组成 Class P/C Tag number Identifier octets 的第一个字节的高2位为 Class ,接下来一位为 P/C ,其他位表示 Tag number Class 有4中类型 Universal(00) Application(01) Context-specific(10) Private(11)
  • P/C 位如果为 1 则表示是 Constructed 的,为 0 表示是 Primitive
  • 如果 0<=Tag number<=30 ,则整个 Identifieroctets 只有一个字节,否则第一个字节的后5位前为1,接下来找第一个最高位为 0 的字节,该字节就是 Identifier octets 的最后一个字节。从第二个字节到最后一个字节去掉最高位的值拼起来就是 Tagnumber 的值。

2.3 长度确定的编码方式

长度确定的编码方式的 Length octets 有两种方法编码长度:

  • 一种是只用一个字节表示长度,其最高位为0,后7位表示长度值,显然这样 只能表示0-127
  • 另一种是第一个字节的最高位为1,其他位表示后面还有多少个字节属于 Length octets (这种方式在我们讲解的secs协议中就有用到 《半导体:Gem/Secs基本协议库的开发(1)》 )。后面的那些字节组成的就是 长度值 。长度值表示的是 Contents octets 所占的字节数。
  • DER 要求如果长度为0-127则要使用第一种方式,如果大于127则使用后一种方式。**

其中 BER-TLV 编码是 ISO 定义一种规范,然后到了 PBOC/EMV 里被简化了, 哪里被简化了呢?
举一个例子, tag 域在 ISO 里可以有 多个字节 , 而 PBOC/EMV 里规定 只用前两个字节 .
下面要讲的TLV解码就是基于 PBOC/EMV 的简化版本.

2.4 tag域编码规则

首先看一下 tag 域是怎样编码的. Tag 域占最多占两个字节. 编码规则如下面两幅图:
​​ 字节编码规则

在这里插入图片描述

这两幅图. 第一个图是第一个字节的编码规则.

  • b8 b7 两位标识 tag 所属类别. 这个可以暂时不用理.
  • b6 决定当前的 TLV 数据是一个单一的数据和复合结构的数据. 复合的 TLV 是指 value 域里也包含一个或多个 TLV , 类似嵌套的编码格式.(嵌套编码也是很常见的格式,譬如在SIM中的 klarf 协议格式,就是典型的嵌套格式)
  • b5~b1 如果全为1,则说明这个 tag 下面还有一个子字节.占两个字节, 否则 tag 占一个字节.

第二幅图:

  • 如果 tag 占用两个字节, 第二个字节的编码格式. B8决定tag是否还有后绪的字节存在,因为前面说过, PBOC/EMV 里的 tag 最多占两个字节,所以该位保持为0.

2.5 tag域的解析

清楚了上面tag编码格式,可很容易写出tag域解码的代码了. 假设,终端接收到一人字节串,这个字节串保存在tlvData的字节数组里, 伪代码如下:

if ((tlvData[i]&0x20) != 0x20)//单一结构
{
    if ((tlvData[i]&0x1f) == 0x1f)//tag两字节
    {
        tagIndex++;

        //解析length域

        //解析value域
    }
    else//tag单字节
    {
        //解析length域

        //解析value域

    }
}
else//复合结构
{

//复合结构可以考虑用递归的方法来实现.

}

2.6 length域 的解析

Length域 的编码比较简单,最多有四个字节, 如果第一个字节的最高位b8为0, b7~b1的值就是value域的长度. 如果b8为1, b7~b1的值指示了下面有几个子字节. 下面子字节的值就是value域的长度.

2.7 value域 的解析

已知· value域 的长度,那么解析自然也手到擒来的事情了,不详细赘述~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

协议茶馆:TLV 格式及编码 的相关文章

随机推荐

  • JDK21新特性探秘

    欢迎关注公众号 通过文章导读关注 11来了 及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景 中间件系列笔记 和 编程高频电子书 文章导读地址 点击查看文
  • 5.1 中央寄存器的原理和组成

    思维导图 中央处理器 CPU 核心原理与组成 引言 中央处理器 CPU 作为计算机的 大脑 在现代计算机硬件中扮演着至关重要的角色 本文旨在深入探讨CPU的基本原理和组成部分 为读者提供一个全面的理解 CPU的基本原理 1 信息处理 CPU
  • <sa8650>sa8650 CDT-之-汽车CDT配置用户指南(上)

    sa8650 sa8650 CDT 之 汽车CDT配置用户指南 上 2 CDT概述 2 1 Platform ID值 2 2 CDT一般结构 2 3 CDT头 2 4 块元数据 2 5 CDBs 2 6 加载CDT的启动过程
  • 实现智能化运维的关键驱动力,你知道可观测性工具吗

    可观测性是指根据系统产生的数据评估内部系统状态的能力 对于IT运维团队来说 可观测性工具是非常重要的 通过这些工具 IT团队可以同时观察或深入了解IT基础架构中不同应用程序和资源的健康状况和状态 从而主动检测异常 分析问题并解决问题 可观测
  • linux centos使用rz、sz命令上传下载文件

    一般情况下 我们会使用终端软件 如 XShell SecureCRT 或 FinalShell 来连接远程服务器后 使用 rz 命令上传本地文件到远程服务器 再解压发版上线 一 安转使用 系统 Linux CentOS 7 安装 rz 和
  • Metasploit使用msfconsole命令启动时,报错‘/usr/share/metasploit-framework/......’

    当使用msfconsole命令启动时 msf无法启动 且报错 解决办法 1 更新apt程序库 apt get update 2 更新metasploit 框架 apt get install metasploit framework 3 重
  • 【C++项目】【报错】[错误] new: No such file or directory, compilation terminated【及解决方法】

    一 问题描述 C源代码文件在编译过程中报错 错误 new No such file or directory compilation terminated 代码如下 include
  • 第8章 多媒体嵌入

    学习目标 了解视频 音频嵌入技术 能够总结HTML5视频 音频嵌入技术的优点 了解常用的视频文件格式和音频文件格式 能够归纳HTML5支持的视频和音频格式 掌握HTML5中视频的嵌入方法 能够在HTML5页面中添加视频文件 掌握HTML5中
  • 服务器的丢包率高怎么办

    网络出现丢包状况了怎么办 具体情况可以从以下几点来判断 1 有可能是线路故障导致的 所以可以用光纤打光仪先判断是否是光纤的问题 2 对于设备方面来说 很多都是网络接口的光纤接触不良等 3 也可能是操作系统的问题 比如网卡问题和网络运营线路问
  • element ui弹窗在别的弹窗下方,优先级不高的问题

    在 弹窗 的标签中加入append to body即可解决该问题
  • Python基础(十六、数据容器汇总)

    文章目录 一 数据容器汇总 二 数据容器通用操作 1 遍历 2 通用统计 len 容器 max 容器 min 容器
  • 解决重定向导致的cookie丢失

    转发前加上 String s response getHeader Set Cookie s HttpOnly Secure SameSite None response setHeader Set Cookie s
  • Java编写CS架构学生管理系统

    一 环境准备 工具 eclipse navicat 环境 jdk8 数据库 mysql5 7 二 正式开始 第一步 分析需求 就是我们需要知道该干什么 登录功能 对学生信息增删改查操作 第二步 创建项目StudentManager 由于我们
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • How to collect data

    How to collect data 爬虫 Java Python 反爬虫 自动化测试工具 Selenium QMetry Automation Studio Te
  • 【ESP32接入国产大模型之文心一言】

    1 怎样接入文心一言 随着人工智能技术的不断发展 自然语言处理领域也得到了广泛的关注和应用 在这个领域中 文心一言作为一款强大的自然语言处理工具 具有许多重要的应用价值 本文将重点介绍如何通过ESP32接入国产大模型之文心一言api 以及其
  • 公司PCB设计需要外包,需要准备哪些资料给PCB设计公司呢?

    现阶段许多公司仍然是让硬件工程师来进行PCB设计和方案开发 除开这些 硬件工程师还要做更多的专业工作 这样势必会使产品上市的时间大大延长 而且现在随着高速数字电子技术的发展 对高速PCB设计的要求也越高 信号完整性仿真分析 nbsp 时序分
  • 14.10-其他阻塞和非阻塞混合使用的原则

    其他阻塞和非阻塞混合使用的原则 1 同时使用阻塞和非阻塞赋值 2 对同一变量既阻塞赋值又非阻塞赋值 综合出错 原则5 不要在同一个always块中同时使用阻塞和非阻塞赋值 1 同时使用阻塞和非阻塞赋值 Verilog语法并没有禁止将阻塞和非
  • DriveMLM

    本人转载于大佬 大型语言模型为智能驾驶开辟了新的格局 赋予了他们类似人类的思维和认知能力 本文深入研究了大型语言模型 LLM 在自动驾驶 AD 中的潜力 进而提出了DriveMLM 这是一种基于LLM的AD框架 可以在仿真环境中实现闭环自动
  • 协议茶馆:TLV 格式及编码

    本篇是多年前的存篇 出处不详 旧酒换新瓶 温故知新 有了新的理解 一 什么是 TLV 格式 几乎所有的通信都有协议 而几乎所有的需要在卡片和终端之间传送的数据 结构 都是 TLV 格式的 TLV 是 tag length 和 value 的