将int位转换为浮点位

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

将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中找到很多信息,而不是我个人可以使用的任何信息,你可以在这里找到信息。

令人烦恼的是,如果您使用的是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); } 

使用BitConverter.ToSingle方法:

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

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

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

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