开发者

How to get the IEEE 754 binary representation of a float in C#

I have some single and double precision floats that I want 开发者_开发百科to write to and read from a byte[]. Is there anything in .Net I can use to convert them to and from their 32 and 64 bit IEEE 754 representations?


.NET Single and Double are already in IEEE-754 format. You can use BitConverter.ToSingle() and ToDouble() to convert byte[] to floating point, GetBytes() to go the other way around.


Update for current .NET/C# using spans:

static void Main()
{
    Span<byte> data = stackalloc byte[20];
    GetBytes(0, data, 0);
    GetBytes(123.45F, data, 4);
    GetBytes(123.45D, data, 8);
}

static unsafe void GetBytes(float value, Span<byte> buffer, int offset)
    => MemoryMarshal.Cast<byte, float>(buffer.Slice(offset))[0] = value;
static unsafe void GetBytes(double value, Span<byte> buffer, int offset)
    => MemoryMarshal.Cast<byte, double>(buffer.Slice(offset))[0] = value;

If you don't want to allocate new arrays all the time (which is what GetBytes does), you can use unsafe code to write to a buffer directly:

static void Main()
{
    byte[] data = new byte[20];
    GetBytes(0, data, 0);
    GetBytes(123.45F, data, 4);
    GetBytes(123.45D, data, 8);
}

static unsafe void GetBytes(float value, byte[] buffer, int offset)
{
    fixed (byte* ptr = &buffer[offset])
    {
        float* typed = (float*)ptr;
        *typed = value;
    }
}
static unsafe void GetBytes(double value, byte[] buffer, int offset)
{
    fixed (byte* ptr = &buffer[offset])
    {
        double* typed = (double*)ptr;
        *typed = value;
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜