Cómo obtener la representación binaria IEEE 754 de un flotante en C#

Resuelto HasaniH asked hace 14 años • 2 respuestas

Tengo algunos flotadores de precisión simple y doble en los que quiero escribir y leer desde un byte []. ¿Hay algo en .Net que pueda usar para convertirlos hacia y desde sus representaciones IEEE 754 de 32 y 64 bits?

HasaniH avatar Nov 23 '10 02:11 HasaniH
Aceptado

.NET Single y Double ya están en formato IEEE-754. Puede usar BitConverter.ToSingle() y ToDouble() para convertir bytes[] a punto flotante, GetBytes() para hacer lo contrario.

Hans Passant avatar Nov 22 '2010 19:11 Hans Passant

Actualización para .NET/C# actual usando intervalos:

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;

Si no desea asignar nuevas matrices todo el tiempo (que es lo que GetByteshace), puede usar unsafecódigo para escribir en un búfer directamente:

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;
    }
}
Marc Gravell avatar Jul 01 '2014 13:07 Marc Gravell