ASN.1解码

BER编码的一种,ASN1标准,全称Tag(标签),Length(长度),Value(值)。
tag值:
在这里插入图片描述

编码规则
第一个字节 bit8~bit7 表明tag所属类型
00 通用级 universal class
01 应用级 application class
10 规范级 context-specific class
11 私有级 private class

第一个字节 bit6 表明本tag的value部分是否包含子tag,1则表示是Constructed(复合)的,为0表示是Primitive(原始);
第一个字节 bit5~bit1 表明是否有第二个字节一起表示本tag,11111 全为1表示有第二个字节,即非11111的都没有第二个字节;
第二个字节 bit8 为1,同时bit7~bit1 大于0 表示有下一个tag
第三~N个字节同第二个字节

然后就是怎么计算tag值的计算,这个最好是看规范,我自己根据网上的描述自己想了一下,这里先记录下来,后续再对照整理一下;

接下来找第一个最高位为0的字节,该字节就是Identifier octets的最后一个字节。从第二个字节到最后一个字节去掉最高位的值拼起来就是Tag number的值。

举例如下:
比如TLV的字节流为7F 81 13…,拆成二进制:0111 1111 1000 0001 0001 0011,第一个字节8、7位01表示是application,6位1表示是复合tag,5-1位11111表示还有tag位;第二个字节8位1且7-1位大于0表示还有tag位。然后把第二个字节和第三个字节的最高位都去掉,剩下000 0001 001 0011,即10010011,tag值为147。

然后是tag value的计算。如果是通用级universal class,则可以通过tag值(即最后一个tag的后五位)计算出tag value的类型。如果是应用级application class,好像需要根据具体的规范文档,确定tag的值的类型,再确定具体的tag value的解码方式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值