代码之家  ›  专栏  ›  技术社区  ›  HasaniH

如何得到C中浮点的IEEE 754二进制表示#

  •  19
  • HasaniH  · 技术社区  · 14 年前

    我有一些单精度和双精度浮点,我想写入和读取一个字节[]。在.Net中有什么可以用来将它们转换成32位和64位的IEEE754表示吗?

    2 回复  |  直到 12 年前
        1
  •  33
  •   Hans Passant    14 年前

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

        2
  •  8
  •   Marc Gravell    5 年前

    使用范围更新当前.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;
        }
    }