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

24

我有一些单精度和双精度浮点数,想要将它们写入和读取自一个字节数组byte[]。在.Net中是否有可以将它们转换为32位和64位IEEE 754表示的方法?

2个回答

36

我们如何在不使用GetBytes()的情况下完成这个任务,也就是使用for循环。 - Satti
@SriramSatti请看我的答案。 - Marc Gravell

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;
    }
}

相比于创建一个数组,这种做法有什么影响?我对内存中发生的事情以及垃圾回收器的操作很感兴趣。 - David Klempfner
1
@Backwards_Dave 简单来说:一个分配了数组,一个没有!GC 的行为完全取决于何时该数组变得不可达,但是:它最终需要被回收。请注意,在当前的 .NET/C# 中,您可以在此处使用 Span<byte> API,并且完全不需要任何 unsafe 和任何数组分配(使用 stackalloc span)- 请参见编辑。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接