解码 BER TLV

Posted

技术标签:

【中文标题】解码 BER TLV【英文标题】:Decoding BER TLV 【发布时间】:2021-02-21 04:39:10 【问题描述】:

我在解码此 TLV 时遇到问题

模板标签 (7001) 2 个字节

长度标签(0020)2字节

值是另一个 TLV

标签(e101)长度(000f)值(373834313938353338353236313430)

标签(e102)长度(0009)值(0009303931383631393038)

70010020e101000f373834313938353338353236313430e1020009303931383631393038

当我尝试任何 TLV 解码器时,它只会将模板标签读取为 1 个字节,然后将错过其余部分。你能就如何解析它提出建议吗?顺便说一句,我接收到 Base64String 的数据,然后我转换为 HEX

【问题讨论】:

您没有提到任何特定的 TLV 解码器,但您对 LENGTH 的解释是有缺陷的。如果存在长度字段,则第一个字节 0020 将被解释为 00,而 20 将被解释为下一个标签。有关详细信息,请参阅 ISO 7816 第 4 部分。 这可能是某人写的,他想写类似 TLV 的东西,但对规则没有足够的了解。因此格式似乎是专有的,我不知道你会找到合适的解析器 这个问题用 asn.1 标记。在 ASN.1 BER (ITU-T X.690) 中,0x70 表示应用程序,构造标签为 16。所以标签确实是 1 个字节。数据要么是错误的(如果您期待别的),要么不是 X.690 BER 数据,要么是您自己对它的解释不正确。 【参考方案1】:

BER 解码器按如下方式解释此 TLV 流:

byte 1,     byte 2,     byte 3,     byte 4 
T=01110000, L=00000001, V=00000000, <end> 
                          ^ inner TLV, starts with T=0 and no place for LV
              ^ length of the V is 1 byte (!!! this why it ends prematurely !!!)
     ^ 10000=SEQUENCE or SEQUENCE OF tag 16
    ^ 1=constructed tag
  ^ 01=APPLICATION tag

【讨论】:

以上是关于解码 BER TLV的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试 - TLV解码(Java) | 机试题+算法思路+考点+代码解析 2023

华为上机真题 2022TLV解码

华为OD机试题,用 Java 解TLV 解码问题

SNMP++ 04-SNMP中OBJECT IDENTIFIER的BER编码与解码及一些思考

转载看懂通信协议:自定义通信协议设计之TLV编码应用

ASN.1笔记——标准编码规则BER