Подтвердить что ты не робот

Как получить двоичное представление IEEE 754 для float в С#

У меня есть одиночные и двойные прецизионные поплавки, которые я хочу записать и прочитать из байта []. Есть ли что-нибудь в .Net, которое я могу использовать для преобразования их в свои 32 и 64-разрядные представления IEEE 754 и из них?

4b9b3361

Ответ 1

.NET Single и Double уже находятся в формате IEEE-754. Вы можете использовать BitConverter.ToSingle() и ToDouble() для преобразования байта [] в плавающую точку, GetBytes(), чтобы пойти наоборот.

Ответ 2

Если вы не хотите выделять новые массивы все время (это то, что делает 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;
    }
}