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

本文关键字:精度 字节 单精度 float 转换 IEEE | 更新日期: 2023-09-27 18:09:42

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

我如何将c#中的float转换为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。请注意,这些数字指的是位的数学位置,和而不是他们的实际物理位置(从中等到中等)介质)。

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

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