将int位转换为浮点位

时间:2014-12-01 21:35:46

标签: c# bit-manipulation

我正在创建一个缓冲区,它将在横幅中读/写,我可以完全消除TCP分段带来的问题。我遇到的唯一问题是浮点变量,其他一切工作正常,除了浮点数。我找不到有关如何将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类中没有任何与float一起使用的函数。

我无法在JavaDocs中找到太多信息,而不是我个人可以使用的任何信息,您可以找到信息here

6 个答案:

答案 0 :(得分:6)

令人兴奋的是,如果您使用的是doublelong,则会有BitConverter.DoubleToInt64BitsBitConverter.Int64BitsToDouble。我真的不知道为什么没有Single / Int32等价物,因为它迫使你在堆上创建一个无意义的byte[](它甚至不允许你传入预先存在的缓冲区。)

如果您乐意使用unsafe代码,您实际上可以在简单的数据thunk中完成所有操作,无需任何方法调用或数组:

public static unsafe int SingleToInt32Bits(float value) {
    return *(int*)(&value);
}
public static unsafe float Int32BitsToSingle(int value) {
    return *(float*)(&value);
}

答案 1 :(得分:3)

使用BitConverter.ToSingle方法:

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

BitConverter创建一些开销和不必要的缓冲区。此解决方案几乎与不安全转换一样快:

[StructLayout(LayoutKind.Explicit)]
struct FloatToInt 
{
    [FieldOffset(0)]private float f;
    [FieldOffset(0)]private int i;
    private static FloatToInt inst = new FloatToInt();
    public static int Convert(float value)
    {
        inst.f = value;
        return t.i;
    }
}

答案 4 :(得分:0)

针对.NET Core,我们现在终于可以简单地使用range(99, 0, -1)BitConverter.SingleToInt32Bits()

答案 5 :(得分:0)

使用System.Runtime.CompilerServices.Unsafe nuget包

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

将浮点数转换为整数

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

会将int转换为浮点数