什么是tlv(标签长度值)?

har*_*ari 23 tlv

什么是tlv?

将钩子(函数)放在代码而不是if/else中?

如果我在不同的平台上运行一段代码,在代码的不同位置,我可以放置tlv函数钩子来识别我所在的平台并做相应的操作?或类似的东西?

好处可以更清洁代码?容易维护?添加新平台时,只需更改tlv代码而不是源代码?

我在这里可能完全错了.

Edw*_*uck 28

TLV是标签长度值编码.通常它更好地通过它的原始名称,类型 - 长度 - 值来引用.

第一个字段是正在处理的数据的"类型",第二个字段指定值的"长度",第三个字段包含表示"类型"的值的"长度"数据量.

通过将更多三元组附加到先前存在的消息,可以在同一消息中发送多条数据.

维基百科上有一个页面,只是更详细一点.不过不要混淆,每个三元组都是"顶级"描述,TLV中通常没有项目嵌套(尽管你可以通过在另一个标签的V中编码TLV三元组来实现这一点).

  • Fabio,是的,你可以在TLV中嵌入TLV,就像我原来提到的那样; 但是,除非你使用比TLV更具体的东西,比如X.690 BER编码,否则没有一个标准需要设置哪个字节.使用上面提到的编码,它是标记的类子字段的第6个字节,它标记构造的值,而不是类型字段的第一个字节.因此,显然没有可接受的构造标记标记,而没有在许多不同的"更具体"的TLV类协议中进行选择. (3认同)
  • 实际上你*可以*在其他TLV中放入更多的TLV:TLV结构中_type_字段的第1个字节的第6位,如果设置为1,则表示_constructed_,这表明TLV结构的_v_部分实际上是一组其他TLV. (2认同)

Kev*_*imm 13

TLV是一种存储数据的方式,以便于快速解析该数据.

通常,您读取类型(标记),长度和值,然后将这些数据发送到处理器函数.此处理器功能仅用于处理类型X.然后,您读取下一个类型,它的长度和值,并将其发送到适当的处理器.

它通常用作处理数据的简单方法,而不会产生大量额外开销.


Dav*_*vey 5

TLV 指的是类型-长度-值三重奏中的编码值,这种更通用的形式记录在 WikiPedia 上

在某些上下文中(例如 EMV),TLV 指的是更具体的 X.690,它也记录在 WikiPedia 上

TLV具有以下优点:

  • 相对紧凑的编码格式
  • 解析相对简单(我在几个小时内编写了一个基本的 X.690 解析器)
  • X.690 TLV 支持嵌套类型(这部分解析起来稍微复杂一些,但据我所知,EMV 不需要)

TLV 最大的缺点是它不是人类直接可读的。但请注意,如果数据转换为十六进制,则读取起来会比较困难。


cey*_*yun 5

我们仍然使用TLV进行数据格式化.如果我们想要将数据发送到接收器,我们准备一个包含Tag-Length-Value数据的TLV包.例如;

Data Tag = DF 82 0A   
Data Length = 03  
Data Value =  30 31 32. 
Run Code Online (Sandbox Code Playgroud)

当我们想要发送它时,我们连接这个3行数据,如DF 82 0A 03 30 31 32.数据包可以包含很多这样的数据.

当接收器获得它时,解析包非常容易,接收器可以平滑地解析所有数据.

数据解析;

数据:DF 82 0A 03 30 31 32 DF 82 0B 04 01 12 22 33

DF 82 0A和DF 82 0B是预定义的(值类型(BCD,HEX,ASCII))标签.当数据到达时,在循环中,首先解析器将查找标签(即DF 82 0A)和另一个字节(数据len).它还将读取高达len的数据字节.