2016-09-30 55 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; 
} 
相关问题