6

私は読んでいます

  • X.690「情報技術 – ASN.1 エンコード規則: Basic Encoding Rules (BER)、Canonical Encoding Rules (CER)、および Distinguished Encoding Rules (DER) の仕様」

特に、可変長の仮数部と指数部を持つ REAL 値のバイナリ エンコーディングに関する §8.5.6.4 (d) は、次のように読みます。

「ビット 2 から 1 が 11 の場合、2 番目の内容のオクテットは、指数の値をエンコードするために使用されるオクテットの数、X(符号なし 2 進数として)をエンコードし、3 番目は ( Xプラス 3)まで」 th (包括的) 内容オクテットは、指数の値を 2 の補数の 2 進数としてエンコードします。X  値は少なくとも 1 でなければなりません。送信された指数の最初の 9 ビットは、すべてゼロまたはすべて 1 であってはなりません。」

「3 番目から (X plus 3) [rd]まで」のオクテットは実際には X+1 オクテットであるため、これは矛盾しています。

誰かがこのセクションを明確にすることができますか?

どちらかを読むべきだと思います

「...次に、2 番目のコンテンツ オクテットは、オクテット数より 1 つ少ない数をエンコードします。Xと言うと、...」

また

「... 3 番目から (X プラス 2)​​ 番目(両端を含む) の内容のオクテットまで...」

また、 Xの最小値は本当に 1 ですか、それとも 1 オクテットを意味する 0 ですか?

補遺: BER でエンコードされたさまざまな値 (意味を持つオクテット文字列) のテスト データを誰かが提供してくれると助かります。

私がこれまでに持っているのは

  • 09 00 = 0 (ゼロ)
  • 09 01 40 = +INF (無限大)
  • 09 01 41 = -INF
  • 09 08 03 2b 31 2e 30 65 2b 30 = "+1.0e+0" = 1.0 (正確な 10 進数)
  • 09 05 80 fe 55 55 55 = 1398101.25 (バイナリ、0x555555 * 2^-2)

よくわからない例は次のとおりです。

  • ? 09 06 83 00 fc 00 00 01 = 0.0625 (バイナリ、0x000001 * 2^-4) ?

また、NaN(数値ではない)に対して定義されたエンコーディングがないようです。

4

2 に答える 2

2

これは単に索引付けの問題だと思います。

コンテンツ オクテット #1 には、いくつかのもの (エンコーディング タイプ、符号ビット、ベース、スケール ファクタ、および指数形式) が含まれています。

指数形式が「11」の場合、次のオクテット (コンテンツ オクテット #2) には、指数の値をエンコードするために使用されるオクテットの数を表す数値 X が含まれます。3 番目のコンテンツ オクテットには、指数値の一部が含まれます。最後のコンテンツ オクテットは x+3 です。

CO1(原料) CO2(x) CO3(指数値) ... CO[x+3]

x の最小値は 1 です。x=1 の場合、CO[x+3] = CO4 であり、指数値のコンテンツ オクテットの最小数が 2 であることを意味します。この形式の最短表現は

CO1 CO2 CO3 CO4

これは、「09 00」がセクション 8.5.6 の有効なエンコードではないことを意味します。「09 01 04」、「09 01 41」も同様です。

PLUS-INFINITY と MINUS-INFINITY は、セクション 8.5.6 の規則と互換性のないセクション 8.5.8 の規則によってエンコードされます。

セクション8.5.6のルールでゼロをエンコードすると、次のようになります

CO1:8  =  1      (Content Octet #1 bit 8)
CO1:7  =  x =  0 (Content Octet #1 bit 7 is dont care, but I'll use 0 for positive)
CO1:65 = 00      (Content Octet #1 bits 6 and 5 is 00 for base two)
CO1:43 =  x = 01 (Content Octet #1 bits 4 and 3 is scaling factor, so we don't care but I'll make it 01 for a value of one)
CO1:21 = 11      (Content Octet #1 bits 2 and 1 is the exponent format and '11' is the format in question)

したがって、コンテンツ オクテット #1 = 1000 0111 は 0x87 です。

コンテンツ オクテット #2 = 0x01 (X の最小値が 1 であるため)

コンテンツ オクテット #3 = 0x00

コンテンツ オクテット #4 = 0x01

コンテンツ オクテット #3 と #4 は指数値 1 を与える

(ゼロ * 1) ^ 1 = ゼロ

于 2011-04-21T23:50:23.647 に答える
0

NaN は Infinity の次に 8.5.9 で定義され、09 01 42 になります。

これ

09 06 83 00 fc 00 00 01 = 0.0625 (バイナリ、0x000001 * 2^-4)

8.5.7.4 d) によると、無効、CO2 (X) は「少なくとも 1 でなければならない」。しかし、これらの制約を無視すると、結果も得られます。

より良い: 09 03 80 fc 01 = 0.0625 (バイナリ、0x01 * 2^-4)

于 2013-07-08T23:01:53.213 に答える