2016-09-30 21 views
3

RFC4506(XDR)をC#で実装しています。
c#(BitConverter.GetBytes)のfloatのバイナリ形式はIEEE標準を使用していますか?私はIEEE単精度浮動小数点数のためのXDR バイナリ形式にC#のにフロートを変換する方法をc#floatをIEEE単精度浮動小数点バイトに変換する

は、私は手動で取材を行うことができますが、私はがあるかどうかを知りたいです既存の方法はこれを行うには?

標準では浮動小数点データ型 "float"(32ビットまたは 4バイト)が定義されています。使用されるエンコーディングは、標準化された 単精度浮動小数点数[IEEE]のIEEE標準です。

S: The sign of the number. Values 0 and 1 represent positive and 
    negative, respectively. One bit. 

    E: The exponent of the number, base 2. 8 bits are devoted to this 
    field. The exponent is biased by 127. 

    F: The fractional part of the number's mantissa, base 2. 23 bits 
    are devoted to this field. 

したがって、浮動小数点数により記述される:次のように

 (-1)**S * 2**(E-Bias) * 1.F 

正確なレイアウトは次の三つ のフィールドは、単精度浮動小数点数を記述する。数の最も最下位バイトが単精度の0,3、 最も最下位ビットは 小数点数を浮動しているのと同様

 +-------+-------+-------+-------+ 
    |byte 0 |byte 1 |byte 2 |byte 3 |    SINGLE-PRECISION 
    S| E |   F   |   FLOATING-POINT NUMBER 
    +-------+-------+-------+-------+ 
    1|<- 8 ->|<-------23 bits------>| 
    <------------32 bits------------> 

は0から31である最初のビット(及びS、E、およびFの最も重要な ビット)のオフセットは、それぞれ0,1および9です。 これらの数字はビットの数学的位置を表し、 は実際の物理的な位置ではありません(媒体は の媒体から異なります)。

+0

'float'は[単精度](https://msdn.microsoft.com/en-us/library/b1e65aza.aspx)ではありませんか? –

+0

質問をより具体的に編集しました。 – Jim

+2

@ハンス伝説は、私が必要としている答えです。答えとして投稿したいですか?私は金曜日の残りの部分を過ごすことに熱心ではなかった:-) – Jim

答えて

5

.NETでもIEEE表現を使用していますので、BitConverter.GetBytesは必要なバイト数を取得します。

ハーフベークされた標準ですが、ビット解釈のみを指定しますが、物理的表現は要求しません。 RFCは、すべてのネットワーキング標準と同様、前世紀のUnix設定にも感染しています。バイトオーダーはビッグエンディアンです。

.NETを実行できるほとんどのマシンでは、バイトを逆にする必要があります。よって:

public static byte[] XdrFloat(float value) { 
    byte[] bytes = BitConverter.GetBytes(value); 
    if (BitConverter.IsLittleEndian) Array.Reverse(bytes); 
    return bytes; 
} 
関連する問題