文章目录
官方文档
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
, 它的二进制为11001001
2, 它的变长编码为
10000001 01001001
2
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的编码分两种情况
- 小于等于30时, 使用5个bit来编码就够了, 此时识别码只有1个字节
- 大于等于31时, 这5个bit全部置为1, 然后它后面的字节为一个变长整数
比如, 将tag number=31进行编码, 结果为
x x x 1 1 1 1 1 0 0 0 1 1 1 1 1
2
长度
如果长度
的第一个字节为:
如果是0x80
, 表示content的长度不确定, 需要根据content的定义来解码content, 此时content之后需要跟随结束码
若不是0x80
, 则又分为单字节编码和多字节编码.
- 如果content的长度小于或等于127个字节, 则使用1个字节表示长度.
- 如果content的长度大于127个字节, 则长度的第1个字节的低7位表示长度占用的字节数(不包含第1个字节), 第1个字节的最高位bit8置为1. 随后的N个字节(包含所有的8bit)共同表示一个整数
假设长度为201, 它的二进制为11001001
2, 最后编码为
10000001 11001001
2
结束码
就是两个字节的0, 即