1

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

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

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

BEGIN
    FooBar ::= SEQUENCE {
      Foo INTEGER (-512..511),
      Bar INTEGER (-512..511)
    }
END

我将以下内容编码为Unaligned PER

test FooBar ::= 
{
   Foo 10,
   Bar -10 
}

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

HEX:           0x829F60
BIN:           100000101001111101100000

EXPECTED HEX:  0x02BF60
EXPECTED BIN:  000000101011111101100000

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

4

2 回答 2

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,依此类推。

于 2013-03-28T13:51:13.723 回答
2

如果您遵循 X.691 中的规则,您最终将获得 11.5.6(来自 13.2.2)。这会将这些受约束的整数值编码为与下限的偏移量,因此将其编码为正值。因此,10 被编码为 522,-10 被编码为 502(分别为十进制)。

编辑:有人建议对计算进行澄清。你的下限是-512。由于 10 = -512 + 522,为 10 编码的偏移量为 522。类似地,由于 -10 = -512 + 502,为 -10 编码的偏移量为 502。然后使用 10 位对这些偏移量进行编码。因此,您最终得到:

value  offset  encoded bits
-----  ------  ------------
   10     522    1000001010 (522 in binary)
  -10     502    0111110110 (502 in binary)
于 2013-03-28T13:32:43.923 回答