TLV格式总结

关于TLV格式,网上搜到其他文档说的都比较片面,这里总结一下。
TLV是BER编码的一种,ASN1标准,全称Tag(标签),Length(长度),Value(值)。 IS-IS数据通信领域中,tlv三元组: tag-length-value(TLV)。
T、L字段长度根据规则生成,V是具体的应用数据。
举例摘抄自Enjoy_endless的大作,原文如下:
https://blog.csdn.net/Enjoy_endless/article/details/78259529.

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

6F328407A0000000031010A5278701019F38129F1A029F33039F40059F1B049F09029F35015F2D086573656E667264659F110101
在这里插入图片描述
如第一行所示,它就是一个由上面buf解析出来的TLV结构
tag为6F,lenth为32,后面为value;
对于TLV来讲,有两种格式,一种是基本格式(BER-TLV),一种是嵌套格式
对于本例的buf来讲,它就是一个复合的嵌套格式,完整解析出来应该是这个样子

整个buf是一个父节点,6F
他有两个子节点84 、A5
对于84节点,他是不可再分的基础格式
对于A5节点,他是一个父节点
可以再拆分为4个子节点87、 9F38、 5F2D、 9F11

一、T的编码规则
TLV格式总结_第1张图片
Tag分为3部分,最高两位,第六位和低五位
1.Tag首字节
bit8~bit7:组合代表tag所属类型
00 通用级 universal class
01 应用级 application class
10 规范级 context-specific class
11 私有级 private class
bit6:是否具有嵌套的TLV子结构
bit5~bit1:如果为全1,则Tag扩展至后续的字节。否则是具体的Tag正文
2.Tag后续字节
bit8:为1时存在后续字节,为0时不存在后续字节
bit7~bit1:Tag正文。

二、L的编码规则
Length首字节bit8:
如果为0,则该Length仅有1字节,Length中bit7~bit1值代表Value字段的长度。(所以如果Length仅有一个字节,则最长支持的Value长度为127)
如果为1,则Length首字节表示Length后续所占的字节数。
例如Length=1F(即00011111),则Value字段的长度为31字节。
例如Length=82(即10000010),则Length后续还要扩展2字节(共3字节)。假设向后扩展后为Length=82016F,则代表Value的长度为0x016F(十进制为367字节)

三、V的编码规则
Value数据区一般没有特定的编码规则,但在某些场合,如果首字节Bit8为1时,需要前补0x00。
例如,如果Value1=74F2,Value2=B34A,则需要将Value2重新转换为00B34A,对应Length长度+1。

你可能感兴趣的:(编解码)