2016-09-30 262 views
3

我在c#中實現了RFC4506(XDR)。
c#中的浮點數的二進制格式(BitConverter.GetBytes)是否使用IEEE標準?將c#float轉換爲IEEE單精度浮點字節

我將如何轉換浮在C#到XDR 二進制格式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 

確切佈局如下。

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

正如一個數字的最高和最顯著字節是0和3, 的單精度最多和最少顯著位浮點 點號碼爲0和31的起始位(和最重要的 位)S,E和F的偏移量分別爲0,1和9。注意 這些數字是指這些位的數學位置,而不是它們的實際物理位置(它們從介質到介質的變化範圍爲 )。

+0

本身不是'浮動'[單精度](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; 
} 
相關問題