24

byte []に​​書き込んだり、byte[]から読み取ったりしたい単精度および倍精度の浮動小数点数がいくつかあります。.Netに、32ビットおよび64ビットのIEEE 754表現との間で変換するために使用できるものはありますか?

4

2 に答える 2

36

.NETSingleおよびDoubleはすでにIEEE-754形式です。BitConverter.ToSingle()およびToDouble()を使用してbyte []を浮動小数点に変換し、 GetBytes ()を使用してその逆を行うことができます。

于 2010-11-22T19:34:05.630 に答える
9

スパンを使用した現在の.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 に答える