我正在创建一个将在横幅中读/写的缓冲区,在其中我可以完全消除TCP分段所带来的问题。我遇到的唯一问题是float变量,除了float以外,其他所有东西都可以正常工作。我找不到有关如何将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中找到很多信息,也没有我个人可以使用的信息,您可以在此处找到信息。
令人讨厌的是,如果您使用的是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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句