将整数位转换为浮点位
本文关键字:转换 整数 | 更新日期: 2023-09-27 18:32:53
我正在创建一个缓冲区,该缓冲区将在横幅中读取/写入,我可以在其中完全消除TCP分段带来的问题。我遇到的唯一问题是浮点变量,除了浮点之外,其他一切正常。我找不到有关如何将 int32 位转换为浮点数的任何信息。
将浮点数转换为 int 位时,使用以下方法(直接从 java 的源代码中剥离出来,并转换)
private int floatToIntBits(float value)
{
int result = BitConverter.ToInt32(BitConverter.GetBytes(value), 0);
if (((result & 0x7F800000) == 0x7F800000) && (result & 0x80000000) != 0)
result = 0x7fc00000;
return result;
}
但是,现在我需要做相反的事情,不幸的是,BitConverter 类中没有任何适用于浮点的函数。
我在JavaDocs中也找不到太多信息,不是我个人可以使用的任何信息,你可以在这里找到信息。
令人烦恼的是,如果您使用的是double
和long
,则有BitConverter.DoubleToInt64Bits
和BitConverter.Int64BitsToDouble
。我真的不知道为什么没有Single
/Int32
等价物,因为它迫使您在堆上创建一个毫无意义的byte[]
(它甚至不允许您传入预先存在的缓冲区)。
如果您乐于使用unsafe
代码,您实际上可以在简单的数据混乱中完成所有操作,而无需任何方法调用或数组:
public static unsafe int SingleToInt32Bits(float value) {
return *(int*)(&value);
}
public static unsafe float Int32BitsToSingle(int value) {
return *(float*)(&value);
}
<</div>
div class="answers">BitConverter会产生一些开销和不必要的缓冲区。此解决方案几乎与不安全转换一样快:
[StructLayout(LayoutKind.Explicit)]
struct FloatToInt
{
[FieldOffset(0)]private float f;
[FieldOffset(0)]private int i;
public static int Convert(float value)
{
return new FloatToInt { f = value }.i;
}
}
使用 BitConverter.ToSingle
方法:
int i = ...;
float f = BitConverter.ToSingle(BitConverter.GetBytes(i), 0);
关键字 float
是数据类型 System.Single
的别名。
您可以使用BitConverter.ToSingle
将四个字节转换为float
。
针对.NET Core,我们现在终于能够简单地使用BitConverter.SingleToInt32Bits()
和BitConverter.Int32BitsToSingle()
!
使用 System.Runtime.CompilerServices.Unsafe nuget 包
Unsafe.As<float, int>(ref value);
将浮点数转换为整数
和
Unsafe.As<int, float>(ref value);
将整数转换为浮点数
自.NET Core 2.0以来,我们有一个内置的API,BitConverter.Int32BitsToSingle:
float f = BitConverter.Int32BitsToSingle(i);
如果在 .NET Framework 4.0+ 或 .NET Standard 2.0 上需要此支持,则可以使用 J2N NuGet 包中的J2N.BitConversion.Int32BitsToSingle(i)
。
完全披露:我是J2N的主要维护者。