笔记
最近学网络管理,其中第二章是关于抽象语法表示ASN.1的,里面有个基本编码规则,本人学习能力较差,对于某一掌握的知识点如果一段时间不看就会忘记。里面关于OID的编码规则的知识点上网查过了大部分的资料,但是有点难看懂,思考了好久才稍微有所理解,担心下次会忘记,所以记下一些自己的理解,如有错误还请指出。
??首先对于给定的一串OID,前面的两个部分x.y就合成一个部分,将前两部分合成的那一部分转换为16进制就是T-L-V中value值的第一个位置,剩下的数据分两个方向解决。
1、如果这个数据小于等于127,那就简单了,占用的是1个字节,直接转换为16进制并写下来。比如200,那就是C8.
2、如果这个数据超过了127,有点改变,我自己觉得难点在这里,网上的看的不是太明白,就用自己的笨方法来解决了,对于拿到的一个大数据,我是先把它写成A1*128^n+A2*128^n-1+...+An*128^1+k
(k为常量,也可能为0),然后我们将前面的A1...An以及k拿出来组成{A1,A2,...,An,k},最后一步,将这些数用二进制表示后将除了最后一个数据外的数据的最高位变成1后形成新的数据{B1,B2,...,Bn,k(此时k不为0)}或{B1,B2,...,An,k(此时k已经为0,这里只是显示一下)}将最后修改的数据转换为16进制写上去就ok了。
OID的标识域都为06,长度域要先算出值域占了几个字节后才能写出。
??其实说了一大堆,有例题才是最实际的,下面写一个例题:
比如OID的数据为1.7.208.133.268743
N=1*40+7=47
,那就是16进制的2F,208=1*128+80
,那么拿出来为{1,80},将它们二进制的最高位变为1(80的最高位不用,因为它是在最后的了)得到{129,80}对应的16进制为81 50,后面的133是小于127的直接转换为16进制,得到的值为85,最后的268743经过一系列的计算后,写成16*128^2+51*128+71
,拿出来{16,51,71},同理将它们二进制的最高位变为1(71的最高位不用,因为它是在最后的了)得到{144,179,71}对应的16进制为90 B3 71.(将最高位变为1时相当于加上128)。现在值域都写出来了,长度占7个字节,为07,那么这个的BER编码为
T | L | V |
---|---|---|
06 | 07 | 2F 81 50 85 90 B3 71 |
网上参考的链接: