为什么在使用 ASN.1 标准时计算 SID2 值时 SID1 应该乘以 40?

Why when calculating SID2 value SID1 should be multiplied by 40 when using ASN.1 standard?

如标准所述(http://rsdn.ru/article/ASN/ASN.xml),在编码 OBJECT IDENTIFIER 时,必须将 SID1 设置为 0,1 或 2,并且 SID2 应具有相应的值,以便只有解码 SID1 和 SID2 的方法。

那么,为什么计算编码 SID2 的公式是 SID1*40 + SID2 ?那里的 40 是多少?

这来自 OID 名称空间限制(IIRC、X.208)。只有三个顶级根(itu-t、iso 和 joint-itu-t),当根命名空间为 itu-t 或 iso 时,第二级限制为 40 个弧(0-39)。因此,可以用一个字节明确地编码前两个弧。

这是 ASN.1 早期遗留下来的。 OID 树中的弧 0 和 1 限制为每个 40 children(0-39),而弧 2 对 children 的数量没有限制。为了节省线路上的位,前两个 OID 节点用单个字节表示(即使对于 Arc 2,如果其 child 小于 47)。 “40”的选择只是为了方便而选择的任意数字,以便轻松计算将前两个 OID 弧放入单个字节。