ASN.1 未对齐 PER 中的二进制补码

msv*_*kon 1 encoding asn.1

我最近不得不使用 ASN.1 未对齐的 PER 编码数据。我在理解数据类型中UPER二进制补码整数编码的方式时遇到问题SEQUENCE

它似乎错误地翻转了最重要的位(单词选择不当)。对于正整数,前导位是1,对于负数,它是0。我认为这里有一种疯狂的方法,但经过一天的工作,我似乎无法从 ITU-T 标准中挖掘出来,也无法自己弄清楚。我怀疑这是因为INTEGER's被包裹在SEQUENCE类型中,但我不明白为什么会这样做。我应该指出,我对 ASN.1 的了解非常有限

一个简单的例子,假设我有以下架构

BEGIN
    FooBar ::= SEQUENCE {
      Foo INTEGER (-512..511),
      Bar INTEGER (-512..511)
    }
END
Run Code Online (Sandbox Code Playgroud)

我正在编码以下内容,如 Unaligned PER

test FooBar ::= 
{
   Foo 10,
   Bar -10 
}
Run Code Online (Sandbox Code Playgroud)

编码结果为十六进制和二进制字符串以及各自的预期值。

HEX:           0x829F60
BIN:           100000101001111101100000

EXPECTED HEX:  0x02BF60
EXPECTED BIN:  000000101011111101100000
Run Code Online (Sandbox Code Playgroud)

关于这里发生了什么的任何想法?

Ale*_*dro 5

“Foo”和“Bar”应该是小写的。

您认为最重要的位被“翻转”的印象源于在您的 FooBar 定义中对 foo 和 bar 的最小和最大允许值的特定选择。

在上面的定义中,foo 的允许值范围是 -512..511。在PER中,foo的编码占用10位。最小允许值 (-512) 编码为 0(10 位)。下一个允许值 (-511) 被编码为 1(10 位)。等等。

如果你用下面的方式定义 FooBar2

FooBar2 ::= SEQUENCE { foo2 INTEGER (1234..5678), bar2 INTEGER (1234..5678) }

foo2 将被编码为 13 位(刚好足以容纳 0 到 4444=5678-1234 之间的值),值 1234 被编码为 0000000000000,值 1235 被编码为 0000000000001,依此类推。