I\'m in the process of creating a buffer that will read/write in a banner in which I can completely eradicate the problems that comes with TCP-Segmentation. The only problem
using the System.Runtime.CompilerServices.Unsafe nuget package
Unsafe.As<float, int>(ref value);
Will convert a float to an int
and
Unsafe.As<int, float>(ref value);
will convert an int to a float
Vexingly, if you were using double
and long
, there is BitConverter.DoubleToInt64Bits
and BitConverter.Int64BitsToDouble
. I have genuinely no idea why there aren't Single
/ Int32
equivalents, as it forces you to create a pointless byte[]
on the heap (it doesn't even let you pass in a pre-existing buffer).
If you are happy to use unsafe
code, you can actually do it all in a simply data thunk, without any method calls or arrays:
public static unsafe int SingleToInt32Bits(float value) {
return *(int*)(&value);
}
public static unsafe float Int32BitsToSingle(int value) {
return *(float*)(&value);
}
The keyword float
is an alias for the data type System.Single
.
You can use the BitConverter.ToSingle
to convert four bytes into a float
.
Targeting .NET Core we are now finally able to simply use BitConverter.SingleToInt32Bits()
and BitConverter.Int32BitsToSingle()
!
Use the BitConverter.ToSingle method:
int i = ...;
float f = BitConverter.ToSingle(BitConverter.GetBytes(i), 0);
BitConverter creates some overhead and unnecessary buffer. This solution is almost as fast as unsafe conversion:
[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;
}
}