我最近不得不使用 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)
关于这里发生了什么的任何想法?
“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,依此类推。