将C#的浮点数转换为IEEE单精度浮点数字节

3
我正在用c#实现RFC4506 (XDR)。
c#中的浮点二进制格式(BitConverter.GetBytes)是否使用IEEE标准?
如何将转换为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。请注意,这些数字是指位的数学位置,而不是它们实际物理位置(这些位置因介质而异)。

float本身不是单精度吗? - Jakub Jankowski
我已经编辑了问题,使其更加具体。 - Jim
2
@Hans,你是个传奇,这正是我需要的答案,你想把它发表为答案吗?我不想花费剩余的星期五下午来移动位并为它们编写测试 :-) - Jim
1个回答

6

.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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接