24

我有一些单精度和双精度浮点数,我想写入和读取字节 []。.Net 中有什么东西可以用来将它们转换为 32 位和 64 位 IEEE 754 表示吗?

4

2 回答 2

36

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

于 2010-11-22T19:34:05.630 回答
9

使用 span 更新当前 .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;
    }
}
于 2014-07-01T13:20:04.907 回答