将c#float转换为IEEE单精度浮点字节

时间:2016-09-30 08:32:33

标签: c# floating-point

我正在c#中实施RFC4506(XDR) c#(BitConverter.GetBytes)中浮点数的二进制格式是否使用IEEE标准?

对于 IEEE 单精度浮点数,如何将 float in c#转换为XDR 二进制格式,我可以执行手动,但我想知道是否是现有的方法来做到这一点?

标准定义了浮点数据类型" float" (32位或    4字节)。使用的编码是标准化的IEEE标准    单精度浮点数[IEEE]。以下三个    fields描述单精度浮点数:

  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。注意    这些数字指的是比特的数学位置,和    不是他们的实际物理位置(从中等到中等)    培养基)。

1 个答案:

答案 0 :(得分:5)

.NET也使用IEEE表示,因此BitConverter.GetBytes可以获得所需的字节数。

然而,这是一个半生不熟的标准,它只指定比特解释,但不要求物理表示。 RFC与上个世纪的Unix偏好感染,就像所有网络标准一样,字节顺序是big-endian。

在大多数可以运行.NET的计算机上,您需要反转字节。因此:

public static byte[] XdrFloat(float value) {
    byte[] bytes = BitConverter.GetBytes(value);
    if (BitConverter.IsLittleEndian) Array.Reverse(bytes);
    return bytes;
}