C#: преобразование ushort в float

из библиотеки, с которой я работаю, я получаю массив ushort.

Я хочу преобразовать их в массив float: первый ushort представляет 16 MSB первого float и второй ushort является 16 LSB первого float и так далее.

Я попытался с чем-то вроде следующего, но значение приводится как значение целого числа, а не необработанные биты:

ushort[] buffer = { 0xBF80, 0x0000 };
float f = (uint)buffer[0] << 16 | buffer[1];
// expected result  => f == -1            (0xBF800000)
// effective result => f == 3.21283686E+9 (0x4F3F8000)

какие будут предложения?

5 ответов


посмотреть


вы должны использовать метода bitconverter класс для этого.

преобразуйте два ushorts в байтовые массивы с помощью метода bitconverter.Метод Getbytes(Типа Uint16), объедините два массива и используйте метода bitconverter.ToSingle (byte[] value,int startIndex) чтобы преобразовать 4 байта в результирующем массиве в float.


Я бы посмотрел на систему.Класс BitConverter. Вы можете использовать BitConverter.GetBytes превратит ваши ushorts в байтовые массивы, затем объедините байтовые массивы и используйте BitConverter, чтобы превратить байтовый массив в float.


используйте соединение C#:

[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]    
public struct FloatUShortUnion {
    [System.Runtime.InteropServices.FieldOffset(0)]
    float floatValue;

    [System.Runtime.InteropServices.FieldOffset(0)]
    ushort short1;

    [System.Runtime.InteropServices.FieldOffset(16)]
    ushort short2;
}

вам нужно будет использовать System.BitConverter, и преобразовать шорты в байтах.

http://msdn.microsoft.com/en-us/library/system.bitconverter.tosingle.aspx