TLV格式说明

来源:互联网 发布:redis c语言接口 编辑:程序博客网 时间:2024/04/26 00:02

在下载公钥的时候经常会遇到tag后面接的是0x81,这并不是这个tag的L长度,0x81的后面一个字节才是长度。

下面是对tag后面出现0x81的说明:

TLVtag-length-value),即每个子域由tag标签(T),子域取值的长度(L)和子域取值(V)构成。

tag标签的属性为bit,由16进制表示,占12个字节长度。例如,“9F33”为一个占用两个字节的tag标签。而“95”为一个占用一个字节的tag标签。若tag标签的第一个字节(注:字节排序方向为从左往右数,第一个字节即为最左边的字节。bit排序规则同理。)的后四个bit为“1111”,则说明该tag占两个字节,例如“9F33”;否则占一个字节,例如“95”。

子域长度(即L本身)的属性也为bit,占13个字节长度。具体编码规则如下:

a)  L字段最左边字节的最左bit位(即bit8)为0,表示该L字段占一个字节,它的后续7bit位(即bit7bit1)表示子域取值的长度,采用二进制数表示子域取值长度的十进制数。例如,某个域取值占3个字节,那么其子域取值长度表示为“00000011”。所以,若子域取值的长度在1127字节之间,那么该L字段本身仅占一个字节。

b)  L字段最左边字节的最左bit位(即bit8)为1,表示该L字段不止占一个字节,那么它到底占几个字节由该最左字节的后续7bit位(即bit7bit1)的十进制取值表示。例如,若最左字节为10000010,表示L字段除该字节外,后面还有两个字节。其后续字节的十进制取值表示子域取值的长度。例如,若L字段为“1000 0001 1111 1111”,表示该子域取值占255个字节。所以,若子域取值的长度在127255字节之间,那么该L字段本身需占两个字节。


也就是说,tag(T)+ 0x81 + L(1字节) + V,tag长度L在127255字节之间;

tag(T)+ 0x82 + L(2字节) + V,tag长度L在大于255字节;

0 0
原创粉丝点击