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