2012-02-03 17 views
6

De una biblioteca con la que estoy trabajando Recibo una matriz de ushort.C#: Convertir ushort para flotar

quiero convertirlos en una serie de float: La primera ushort representa el 16 MSB del primer y el segundo floatushort es el 16 LSB del primer float, y así sucesivamente.

me trataron con algo como lo siguiente, pero el valor se presenta como el valor del número entero, no los bits primas:

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

Cualquier sugerencia?

Respuesta

9

Echa un vistazo a la clase System.BitConverter.

En particular, el método ToSingle que toma una secuencia de bytes y los convierte en un flotante.

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); 

EDITAR
En el ejemplo, me había invertido el/LSB fin MSB .. Ahora es correcta

1

Utilice un C# unión:

[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

La sintaxis de C# para matrices de tamaño fijo es 'fixed ushort buffer [2];', y no estoy seguro si eso funciona junto con '[FieldOffset]'. No puede usar una matriz C# normal ya que eso convertiría el puntero a la matriz, no el contenido de la matriz. – Daniel

+0

@Daniel gracias, no he programado en C# mucho recientemente. –

1

me vería en la clase System.BitConverter. Puede usar BitConverter.GetBytes para convertir sus ushorts en matrices de bytes, luego combinar sus matrices de bytes y usar BitConverter para convertir el conjunto de bytes en un flotante.

Cuestiones relacionadas