繁体   English   中英

将 int 位转换为 float 位

[英]Convert int bits to float bits

我正在创建一个缓冲区,该缓冲区将在横幅中读取/写入,我可以在其中完全消除 TCP 分段带来的问题。 我遇到的唯一问题是 float 变量,除了 float 之外,其他一切都很好。 我找不到有关如何将 int32 位转换为浮点数的任何信息。

将 float 转换为 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 class 中没有任何函数可以使用 float。

我也无法在 JavaDocs 中找到太多信息,我个人无法使用的任何信息,您可以在此处找到信息。

令人烦恼的是,如果您使用doublelong ,则有BitConverter.DoubleToInt64BitsBitConverter.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);
}

使用BitConverter.ToSingle方法:

int i = ...;
float f = BitConverter.ToSingle(BitConverter.GetBytes(i), 0);

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

关键字float是数据类型System.Single的别名。

您可以使用BitConverter.ToSingle将四个字节转换为float

针对 .NET Core,我们现在终于可以简单地使用BitConverter.SingleToInt32Bits()BitConverter.Int32BitsToSingle()

使用 System.Runtime.CompilerServices.Unsafe nuget 包

Unsafe.As<float, int>(ref value);

将 float 转换为 int

Unsafe.As<int, float>(ref value);

将 int 转换为 float

自 .NET Core 2.0 以来,我们为此内置了 API, BitConverter.Int32BitsToSingle

float f = BitConverter.Int32BitsToSingle(i);

如果您在 .NET Framework 4.0+ 或 .NET Standard 2.0 上需要此支持,您可以使用 J2N NuGet Package中的J2N.BitConversion.Int32BitsToSingle(i)

全面披露:我是 J2N 的主要维护者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM