如何在C#中获得浮点数的IEEE 754二进制表示形式

问题描述 投票:20回答:2

我有一些单精度和双精度浮点数,我想写入和读取一个字节[]。 .Net中有什么我可以用来在它们的32位和64位IEEE 754表示形式之间进行转换的?]

c# binary floating-point ieee-754
2个回答
33
投票

。NET Single和Double已经采用IEEE-754格式。您可以使用BitConverter.ToSingle()和ToDouble()将byte []转换为浮点数,使用GetBytes()将其转换为其他方式。


8
投票

使用跨度更新当前.NET / C#:

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;

如果您不想一直分配新数组(这是GetBytes所做的,则可以使用unsafe代码直接写入缓冲区:

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.