我正在创建一个缓冲区,该缓冲区将在横幅中读/写,在其中我可以完全消除 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 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/lang/Float.java#Float.intBitsToFloat%28int%29.
令人烦恼的是,如果你正在使用double
and long
, 有BitConverter.DoubleToInt64Bits
and 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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)