ASN.1未对准PER中的两个补码

时间:2013-03-27 21:52:22

标签: 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

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

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

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

HEX:           0x829F60
BIN:           100000101001111101100000

EXPECTED HEX:  0x02BF60
EXPECTED BIN:  000000101011111101100000

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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)