2013-03-27 29 views
1

補充我最近曾與ASN.1未對齊PER編碼數據的工作。我在UPER數據類型SEQUENCE中做了二進制補碼整數編碼時遇到問題。兩個在ASN.1不對齊的PER

這似乎是不正確的翻轉最顯著位(字的選擇不當)。對於正整數,領先位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

「Foo」和「Bar」應該是小寫。

你印象最顯著位爲「翻轉」從允許在你FooBar的定義foo和bar的值的最小值和最大值的特定選擇導出。

foo的允許值範圍內,在上方的定義,是-512..511。在PER中,foo的編碼佔用10位。最小允許值(-512)被編碼爲0(10位)。下一個允許值(-511)被編碼爲1(10位)。等等。

如果您通過以下方式

FooBar2 :: = SEQUENCE定義FooBar2 { foo2的INTEGER(1234..5678), BAR2 INTEGER(1234..5678) }

foo2的會編碼爲13位(恰好足以保持0和4444之間的值= 5678-1234),其中值1234被編碼爲0000000000000,值1235被編碼爲0000000000001等等。

2

如果你遵循X.691規則,你將在11.5.6(從13.2.2)結束。這將這些值作爲整數進行編碼,作爲下限的偏移量,因此作爲正值進行編碼。所以,10被編碼爲522,-10被編碼爲502(分別爲10進制)。

編輯:有人建議在計算澄清。你的下限是-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)