2014-12-01 155 views
1

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

当转换一个浮动到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; 
} 

然而,现在我需要做相反的,不幸的是,有ISN在与float一起使用的BitConverter类中没有任何函数。

我不能在JavaDocs中找到很多信息,也没有我可以亲自使用的任何信息,您可以找到信息here

回答

3

如果您使用的是doublelong,那么存在BitConverter.DoubleToInt64BitsBitConverter.Int64BitsToDouble。我真的不知道为什么没有相应的数据,因为它迫使你在堆上创建一个毫无意义的byte[](它甚至不允许你传入一个预先存在的缓冲区)。

如果你乐于使用unsafe代码,你实际上可以做到这一切在一个简单的数据thunk的,没有任何方法调用或数组:

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

不幸的是,因为这是Unity3D的客户端API,所以我不能使用不安全的代码,我之前发现这个解决方案,并且Unity不允许它。感谢您的回复,+1为简单的解决方案。 – Hobbyist 2014-12-02 13:34:05

+0

@ Christian.tucker是的,这是烦人的;我做了很多工作(我维护了几个二进制序列化器和其他网络实用程序库),所以当不允许使用'unsafe'时,这会伤害我很多* – 2014-12-02 23:16:23

2

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

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

+0

我从来没有听说过的别名,非常有趣。 – Hobbyist 2014-12-01 21:42:17

+0

这是正确的用法吗? 'byte ch1 = ReadByte(); byte ch2 = ReadByte(); byte ch3 = ReadByte(); byte ch4 = ReadByte(); return BitConverter.ToSingle(new byte [] {ch1,ch2,ch3,ch4},0);' – Hobbyist 2014-12-01 21:44:35

+0

@ Christian.tucker:是的,看起来不错。 – Guffa 2014-12-01 21:51:44

相关问题