C # эквивалент (чтение переменной как другого типа) - PullRequest
2 голосов
/ 28 февраля 2011

Я конвертировал некоторую часть своего приложения из C ++ в C #.Есть эта часть кодирования / декодирования, которая мне нужна для чтения переменной в виде числа с плавающей запятой, определяемого как uint:

uint result = 0;

... // a value is set to result

return (*((float *)&result)); // get result as a float value

В любом случае, чтобы преобразовать последнюю строку в C #?Спасибо всем ..

Ответы [ 4 ]

6 голосов
/ 28 февраля 2011

Вы можете сделать это с помощью небезопасного кода - или вы можете использовать BitConverter.GetBytes() для преобразования значения в байтовый массив, а затем BitConverter.ToSingle() для обратного преобразования.Очевидно, это менее эффективно, но сработает, если вы не можете использовать небезопасный код.

РЕДАКТИРОВАТЬ: есть еще одна альтернатива, которую я использовал в MiscUtil ,использование C-подобного «union» для работы гораздо больше, чем в исходном примере, но с помощью пользовательской структуры:

[StructLayout(LayoutKind.Explicit)]
    struct Int32SingleUnion
{
    [FieldOffset(0)]
    int i;

    [FieldOffset(0)]
    float f;

    internal Int32SingleUnion(int i)
    {
        this.f = 0; // Just to keep the compiler happy
        this.i = i;
    }

    internal Int32SingleUnion(float f)
    {
        this.i = 0; // Just to keep the compiler happy
        this.f = f;
    }

    internal int AsInt32
    {
        get { return i; }
    }

    internal float AsSingle
    {
        get { return f; }
    }
}

(Вы можете сделать одно и то же для длинных и двойных, конечно.)

4 голосов
/ 28 февраля 2011

Вы можете использовать BitConverter .Например,

return BitConverter.ToSingle(BitConverter.GetBytes(result), 0);
2 голосов
/ 28 февраля 2011

Два варианта:

1) Используйте указатели C #. Компилятор позволит вам, если вы включите «небезопасный код» в свойствах проекта. Пожалуйста, прочитайте больше здесь: http://msdn.microsoft.com/en-us/library/y31yhkeb(v=VS.100).aspx

2) Используйте класс BitConverter. В частности, BitConverter.GetBytes () преобразует вашу uint в байты, а затем BitConverter.ToSingle () для преобразования байтов в число с плавающей точкой. Читайте здесь: http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

Удачи!

0 голосов
/ 28 февраля 2011

Класс BitConverter ваш друг здесь. http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...