【问题标题】:Encoding of first identifier of an OID in ASN.1 into BER将 ASN.1 中 OID 的第一个标识符编码为 BER
【发布时间】:2015-09-02 07:24:03
【问题描述】:

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。

【问题讨论】:

  • This 确认了这一点,但没有链接到why的解释:“value1 仅限于值 0、1 和 2;当 value1 为 0 或1"。为此,您可能需要深入了解互联网史前史、X. 标准委员会等,我不确定这些东西是在线的。

标签: asn.1 ber


【解决方案1】:

引自教授的“ASN.1 Complete”一书。 John Larmouth,第 3.14 节(本书可从http://www.oss.com/asn1/resources/books-whitepapers-pubs/larmouth-asn1-book.pdf 免费获得):

编码前两个弧的八位字节(在 1986 年)被认为不太可能有大值,并且对这两个弧使用两个八位字节是“一件坏事”。因此引入了“优化”(强制)。

嗯,有三个*弧,我们可以使用上述“更多位”概念在单个八位字节中容纳多达 128 个弧(0 到 127)的编码。 128除以3大约是40!让我们假设前两个*弧永远不会有超过 40 个子弧,并将前 40 个伪弧分配给*弧 0,接下来的 40 个分配给*弧 1,其余的分配给*弧。水平弧 2。

【讨论】:

  • 好的,正如我所料,这是一个节省空间的黑客。
最近更新 更多