我最近不得不使用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
关于这里发生了什么的任何想法?
答案 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)