1

私は最近、ASN.1 Unaligned PER でエンコードされたデータを扱う必要がありました。データ型UPERで 2 の補数の整数エンコードを行う方法を理解するのに問題があります。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 
}

16 進数およびバイナリ文字列としてのエンコードの結果と、それぞれ期待される値。

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 の規則に従うと、(13.2.2 から) 11.5.6 になります。これは、制約された整数であるこれらの値を、下限からのオフセットとして、したがって正の値としてエンコードします。したがって、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)
于 2013-03-28T13:32:43.923 に答える