C #: конвертировать ushort, чтобы плавать - PullRequest
6 голосов
/ 03 февраля 2012

Из библиотеки, с которой я работаю, я получаю массив 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 ]

10 голосов
/ 03 февраля 2012

Посмотрите на System.BitConverter класс.

В частности, метод ToSingle , который берет последовательность байтов и преобразует их в число с плавающей точкой.

 ushort[] buffer = {0xBF80, 0x0000};
 byte[] bytes = new byte[4];
 bytes[0] = (byte)(buffer[1] & 0xFF);
 bytes[1] = (byte)(buffer[1] >> 8);
 bytes[2] = (byte)(buffer[0] & 0xFF);
 bytes[3] = (byte)(buffer[0] >> 8);
 float value = BitConverter.ToSingle( bytes, 0 );

EDIT
В этом примере я изменил порядок MSB / LSB. Теперь он правильный

2 голосов
/ 03 февраля 2012

Для этого следует использовать класс BitConverter .

Преобразовать два ushorts в байтовые массивы с помощью BitConverter.GetBytes (UInt16) , объединить два массива ииспользуйте BitConverter.ToSingle (значение byte [], int startIndex) для преобразования 4 байтов в результирующем массиве в число с плавающей точкой.

1 голос
/ 03 февраля 2012

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

1 голос
/ 03 февраля 2012

Используйте объединение 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;
}
0 голосов
/ 03 февраля 2012

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

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

...