ASN.1 BER编码


官方文档
https://www.itu.int/rec/T-REC-X/en
https://www.itu.int/rec/T-REC-X.690/en
本文中的一些格式说明
二进制数据
00101 2
十六进制数据
0xAFBD

AFBD 16

变长整数编码

在计算机中, 一个整数通常用1, 2, 4, 8个字节来表示. 而在通信中, 为了够表示任意长度的整数, 需要使用本节中的变长整数编码
基本原理:
1字节有8个bit, 使用它的低7位来存储数据, 最高位用于表示编码是否结束
最高位为1时, 表示编码没有结束, 它的下一个字节仍然是整数的一部分.
最高位为0时, 表示本字节已经是整数的最后一个字节, 编码结束.
例如, 十进制的201, 它的二进制为110010012, 它的变长编码为
10000001 010010012

BER基本格式

有两种格式
格式1:

+---------------------------------------------------------------------+
|     识别码  |   长度   |  contents  ...                              |
+----------------------------------------------------------------------+

格式2

+------------------------------------------------------------------------+
|     识别码  |   0x80  |  contents  ...             |  结束码 0x00 0x00  |
+------------------------------------------------------------------------+

识别码格式

    8          7        6        5      4      3      2     1
+----------------------------------------------------------------------+----------
|  class(2 bit)    |   p/c    |     tag number                         |  tag number subsequence...
+----------------------------------------------------------------------+-----------

class, 高两位, 的值有
002 表示ASN.1基本类型, Universal
012 表示是应用定义的类型, Application
102 表示由上下文决定, Context-specific
112 表示私有的类型, Private

p/c, 第6位, 表示content的编码规则, 它的值有
0 表示基本类型
1 表示结构化类型

tag number的编码分两种情况

  1. 小于等于30时, 使用5个bit来编码就够了, 此时识别码只有1个字节
  2. 大于等于31时, 这5个bit全部置为1, 然后它后面的字节为一个变长整数

比如, 将tag number=31进行编码, 结果为
x x x 1 1 1 1 1 0 0 0 1 1 1 1 12

长度

如果长度的第一个字节为:
如果是0x80, 表示content的长度不确定, 需要根据content的定义来解码content, 此时content之后需要跟随结束码
若不是0x80, 则又分为单字节编码和多字节编码.

  1. 如果content的长度小于或等于127个字节, 则使用1个字节表示长度.
  2. 如果content的长度大于127个字节, 则长度的第1个字节的低7位表示长度占用的字节数(不包含第1个字节), 第1个字节的最高位bit8置为1. 随后的N个字节(包含所有的8bit)共同表示一个整数
    假设长度为201, 它的二进制为110010012, 最后编码为
    10000001 110010012

结束码

就是两个字节的0, 即

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值