float-Zahl nach byte[] konvertieren

Mobix

Grünschnabel
Hallo,
ich benötige für die Datenübertragung auf eine externe Elektronik (C51 µC) in einem C#-Programm die Konvertierung eines float-Wertes in ein ByteArray.
Der Inhalt des ByteArray sollte dem IEEE 754-Format (Single Precision) entsprechen.

Zur IEEE 754 siehe auch: http://stevehollasch.com/cgindex/coding/ieeefloat.html
oder bei Keil unter: http://www.keil.com/support/man/docs/c51/c51_ap_floatingpt.htm

Hat jemand sowas schon realisiert, oder muss ich das relativ umständlich mit Bit-Operationen machen.

Generell bin ich der Meinung, das auch C# die float-Werte in diesem Format behandelt, leider habe ich bisher keine Möglichkeit gefunden auf float-Werte Byte für Byte zuzugreifen.

Danke und Gruss
Mobix
 
Hi.

Ich weiss zwar leider nicht in welchem Format es gespeichert wird, aber es gibt da die BitConverter Klasse.

BitConverter Class

Bei ihr gibts die Methode GetBytes.
Wenn du der Methode einen float/Single Wert übergibst bekommst das Byte Array dazu.

Kannsts ja mal probieren.

MfG,
Alex
 
Hallo Alex,

das ist schon mal ein großer Schritt in die richtige Richtung. Danke!

Ein double- bzw. float(Single)-Wert entspricht laut M$ auch der IEEE 754.
Um das Ergebnis jetzt genau zu interpretieren wäre noch eine Beschreibung der einzelnen Bit-Postionen notwendig, da der µC offensichtlich eine andere Anordnung der Bits hat.

Wenn jemand hier weiter weis oder eine Beschreibung hat, wäre ich Dankbar.
Ich versuch es auf alle Fälle mit der Analyse einzelner Zahlenwerte. Wenn ich die
Bit-Positionen weis, dann poste ich sie.

Gruss
Mobix
 
Hallo,

also hier kurz die Bit-Positionen nach der Wandlung zum Hex-Format bzw. Byte-Format mit:
Code:
byte[] floatArray;
byte[] doubleArray;
 
float floatWert=1.9F;
double doubleWert=1.9;
 
byteArray = BitConverter.GetBytes( floatWert );
doubleArray = BitConverter.GetBytes( doubleWert );

(S: Vorzeichen; E: Exponent; M: Matisse; MSB steht links)

Für float(Single)-Werte ergibt sich ein Wert mit vier Byte:
Byte[3]
[SEEEEEEE]
Byte[2]
[EMMMMMMM]
Byte[1] und Byte[0]
[MMMMMMMM]

Für double-Werte ergibt sich ein Wert mit acht Byte:
Byte[7]
[SEEEEEEE]
Byte[6]
[EEEEMMMM]
Byte[5] bis Byte[0]
[MMMMMMMM]

Wichtig ist noch für alle Interssierten, dass bei der Mantisse das erste Bit weg fällt, da dieses immer 1 ist! Ausnahme dabei ist der 0-Wert, da sind alle Bits des Byte-Array 0.

Danke nochmal und Gruss
Mobix
 
Zurück