BER编码
BRE(basic enconding rules)是asn.1最早定义的编码规则
ASN.1采用数据类型和值,BER定义了值得编码传输格式,即传输语法
只有具体值才可以被传输,值也会属于不同数据类型,传输语法就是要为属于不同数据类型得值制定一套标准编码格式
BRE得任务:
将ASN.1定义得数据类型 得值编码成字节串
日常学习就用TLV来书写吧
- Value:是传输值得本身
- Tag:控制信息,用于表明传输得值属于那种数据类型
- Length:控制信息,表明值所占八位组(字节)得个数
TLV每个域都是一个八位组(字符串)
每一个V本身又可以是1个和多个TLV组,即V可以递归多个TLV组BER传输语法是基于三元组得(为了避免不同系统上得混淆,没用采用Byte为单位)
BER比特序列传输顺序:
八位组得最高有效位在最左边,最低有效位在最右边,传输顺序自最低有效位开始,到最高有效位结束
BER-Tag
Tag分为0-30和31以上两种格式
当标签号大于31,会将标签号全部置1,作为转义符,实际得标签号表示在后继得八位组,最左边一位,1表示不是最后一个,0表示为最后一个
有1表示后面还有八元组。第一位101表示5小于30就前面用10000表示。同样这个1也是表示后面还有八元组
简单类型
用integer举例
他是universal类得2号,且为简单类型,所以编码为
00 0 00010
SNMP中tag编码,第一个choice类型实际上是application1类型。
都是application类,所以01开头,都是简单类型所以pc位0
写16进制在二进制4位一组来看就行。
BER-Length
也是分为两组
注意:这个长度是value得长度。
小于127只占用一个字节,最左边为0,用右边7位表示。
大于127最左边为1,后7位指明后继表示长度得字节数,几个字节。
举两个例子,255和256
长度不确定(仅了解)
长度不知道得就前缀就是10000000,加个值编码,最后两个全为0得字节作为结束符
各个数据类型得BER编码
- T 01是因为十六进制得tag位。
- L 先看V是几个字节,V是一个,就用01
- V 00 ff
null没有值,所以V没有。L为00
注意这个Value用二进制补码
注意128,129这里超一个字节了,所以给前面加00000000.
负数这里
-128 最前面得1就表示他是负数了
-129 要用1表示负数,所以给前面加一个字节得1表示为负数
由于可能补不到8得整数倍
310那个表示废弃多少位
注意补位在右边,填01都无所谓。在V最开始声明废弃多少位,即写多少。
十六进制表示中得03就表示丢弃多少位
octet string 也会出现没有凑够8位得情况下面这个就写上了E0.11100000
- OBJECT INDENTIFIER
讲根部与下一个子节点一起编码
记住这个公式,n=40*x+Y
X根据表只能能是012取值
除了前两个,都是独立编码
0-127不是0-255
类比了leagth,长格式
二进制每7位一组,然后补指示位。然后化十六进制
一道练习题
构造类型
SEQUENCE就要嵌套TLV格式
注意这个嵌套的长度L字节是06,算上V中所有tlv个数,还包含嵌套V中的个数,这里只有一个就是1
T位置sequence是011 0000 从后往前,四位一划分。
标签类型
复习一下显式隐式。这么记
隐式一个tag,显式两个tag
例子很典型,先确定V是00,记住已经有值00了,所以L写01不是00
T要写新标签的tag,01 0 00001=41(H).
子标签无法体现
显式就把老标签写道内嵌的tlv里,L要写03
要十分注意,因为有了嵌套,所以tag标签中的pc位要置1,所以二进制就变成了01 1 00001=61(H)
这里L位就是,嵌套L是V中个数。外面的L是T+L+V个数之和