将ASN.1中OID的第一个标识符编码为BER

时间:2015-09-02 07:24:04

标签: asn.1 ber

OID似乎是一种表示树状结构的方式。

例如1.3.6.1是iso(1).org(3).did(6).internet(1)

最常用的编码方案似乎是BER,我对前两位的编码感到困惑。为什么前两位数字被编码成一个字节,为什么会这样:

int first_digit = first_byte / 40;
int second_byte = first_byte % 40;

假设前两个字节总是小数字,因此可以存储'容易在一个字节?如果是这样,我可以理解。

但是为什么使用魔数40?为什么40?

例如。 1.3.xxx以上的第一个字节将被编码为43。

1 个答案:

答案 0 :(得分:2)

引用" ASN.1完成"书,由教授。 John Larmouth,第3.14节(该书可从http://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf免费获得):

  

编码前两个弧的八位字节是(在1986年)被认为不可能有大的值,并且对于这两个弧使用两个八位字节是一个坏事"。所以"优化" (强制性)被引入。

     

嗯,有三个顶级弧,我们可以在单个八位字节中容纳最多128个弧(0到127)的编码,其中#34;更多位"上面描述的概念。 128除以3约为40!让我们假设前两个顶级弧将永远不会超过40个子弧,并将前40个伪弧分配给顶级弧0,接下来40个分配给顶级弧1,并且剩余到顶级弧2。