I have some single and double precision floats that I want to write to and read from a byte[]. Is there anything in .Net I can use to convert them to and from their 32 and 64 bit IEEE 754 representations?
            Asked
            
        
        
            Active
            
        
            Viewed 1.8k times
        
    2 Answers
36
            .NET Single and Double are already in IEEE-754 format. You can use BitConverter.ToSingle() and ToDouble() to convert byte[] to floating point, GetBytes() to go the other way around.
        Thomas Weller
        
- 55,411
 - 20
 - 125
 - 222
 
        Hans Passant
        
- 922,412
 - 146
 - 1,693
 - 2,536
 
- 
                    How can We do this without using GetBytes(). i mean using forloops – Satti Feb 10 '14 at 07:02
 
9
            
            
        Update for current .NET/C# using spans:
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;
If you don't want to allocate new arrays all the time (which is what GetBytes does), you can use unsafe code to write to a buffer directly:
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
        
- 1,026,079
 - 266
 - 2,566
 - 2,900
 
- 
                    What are the implications for doing it this way compared to creating an array? I'm interested in what happens in memory and what the GC does etc. – David Klempfner Nov 17 '19 at 01:19
 - 
                    1@Backwards_Dave simply: one allocates an array, one doesn't! what GC does will depend entirely upon when that array is unreachable, but: it will need to be collected at some point. Note that in current .NET/C#, you could use a `Span
` API here, and do the entire thing without any `unsafe` and without any array allocations *at all* (using a `stackalloc` span) - see edit – Marc Gravell Nov 17 '19 at 10:14