将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。请注意,这些数字指的是位的数学位置,和而不是他们的实际物理位置(从中等到中等)介质)。
。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;
}