Hi ich habe folgendes Problem.
Ich erhalte 4 bytes die in einem byte Array gespeichert sind.
Diese 4 bytes sollen in einen 32-Bit Floating-Point (single precision)
konvertiert werden.
Ja, dann ist die Funktion kaputt oder die Doku dazu falsch. Es kann aber
auch, und das ist sehr viel wahrscheinlicher, ein Fehler in Zeile 42 von
deinem Programm sein.
Oliver
Mo schrieb:> Ich erhalte 4 bytes die in einem byte Array gespeichert sind.> Diese 4 bytes sollen in einen 32-Bit Floating-Point (single precision)> konvertiert werden.
Ein Dejavu...
Vielleicht hilft der Beitrag "Convert char array to float value"Oliver S. schrieb:> Das wird wohl ein little-/big-Endian-Problem sein.
Oder die aufgerufene Funktion funktioniert nicht wie geplant.
Ja so wie es nun aussieht wird in meiner C# Oberfläche der Wert flasch
dragestellt. Wenn ich den Wert 2390 in ein byte array konvertiere
erhalte ich
0x56 0x09 0x00 0x00 zurück.
Lothar M. schrieb:> Oder die aufgerufene Funktion funktioniert nicht wie geplant.
Das tut die schon, die liefert ja das richtige Ergebnis für das, was sie
tun soll.
0x56090000 soll 2390 ergeben.
Etwas scharfes Hinsehen, und man erkennt…
Oliver
Mo schrieb:> ByteArray[0] = 0x56;> ByteArray[1] = 0x09;> ByteArray[2] = 0x00;> ByteArray[3] = 0x00;> Der Wert sollte hier 2390 sein.
Das stimmt nicht ganz...
https://gregstoll.com/~gregstoll/floattohex/
EDIT: oha, da dümpeln wir ja grade noch bei den absoluten Grundlag zum
Thema "Darstellung binärer Zahlen" herum.
Mo schrieb:> Der Wert sollte hier 2390 sein.
Wie, zum Teufel, kommst du auf diese Schnapsidee?
In dem Float-Format, welches .net benutzt, würde 2390 die Bytefolge
0x00, 0x60, 0x15, 0x45 ergeben.
Und das Format, was .net da benutzt, ist ein ziemlich standardmäßiges.
IEEE- irgendwas (genaue Zahl vergessen).
Das Problem liegt also wohl in der Quelle, die benutzt offensichtlich
ein anderes Float-Format. Wenn die Bytes, die du geliefert hast,
überhaupt eine Float-Zahl darstellen. 2390 jedenfalls stellen sie
zumindest in KEINEM der mir bekannten 32Bit-Float-Formate dar. Was
natürlich sicher nicht ausschließt, dass es eins geben mag, was ich
nicht kenne.
Genau das ist ja das Schöne an Standards: es gibt so viele davon...
c-hater schrieb:> 2390 jedenfalls stellen sie> zumindest in KEINEM der mir bekannten 32Bit-Float-Formate dar. Was> natürlich sicher nicht ausschließt, dass es eins geben mag, was ich> nicht kenne.
Jetzt schwächelst du aber gewaltig. Jemandem wie dir muß die Lösung
direkt ins Auge springen, alles andere wäre deinem Ruf abträglich.
Welches geheime Format das ist, steht ja schon weiter oben, aber für
dich nochmal: 32 Bit (u)int
Oliver
Oliver S. schrieb:> Jetzt schwächelst du aber gewaltig.
Nicht wirklich...
> Welches geheime Format das ist, steht ja schon weiter oben, aber für> dich nochmal: 32 Bit (u)int
Und du glaubst ernsthaft, dass ich das nicht erkannt hätte? Dann lies'
das Posting nochmal und taste es auf Hinweise von Sarkasmus ab...
Mo schrieb:> Der Wert sollte hier 2390 sein. Ich erhalte allerdings in C# den Wert:> 3.349103E-42
Wie kommst du auf die Idee, dass deine vier Byte ein single Precision
Float repräsentieren sollen.
c-hater schrieb:> Wie, zum Teufel, kommst du auf diese Schnapsidee?
Tja, manche Leute sind öfter als andere geneigt, 4 nebeneinander
geschriebene Bytes als eine Gleitkommazahl zu verstehen. Das stimmt hier
aber nicht, denn es sind die 4 Bytes aus einem long oder unsigned long.
Wenn man das also (zu Fuß) ins Gleitkommaformat konvertieren will, dann
geht das mal ganz grob skizziert etwa so:
1. Zusammenfassen der 4 Bytes zu einer long Variablen.
(wenn negativ, dann neg.VZ merken und -Zahl machen, d.h. positiv
machen)
2. diese long Variable solange nach links verschieben, bis das Bit 1<<23
= 1 ist. Das ergibt die Mantisse.
(Ausnahme: null, ist vorher abzuprüfen)
Bei alldem die Anzahl der Verschiebungen testen.
3. zu einem Offset (zumeist 80h) die Zahl der Verschiebungen addieren.
Das ergibt den Exponenten
4. die Exponent und Mantisse einsortieren:
Byte[0] = Exponent
Byte[1] = Bits 23..16 der Mantisse
Byte[2] = Bits 15..8 der Mantisse
Byte[3] = Bits 7..0 der Mantisse
5. Exponent um 1 Bit nach rechts verschieben.
Das Bit 0 kommt dann ins Bit 7 von Byte[1]
und das Vorzeichenbit kommt in Bit 7 von Byte[0]
So, in C macht das ne Bibliotheksfunktion, da braucht man lediglich ne
Zuweisung zu schreiben und den Rest macht der Compiler. Aber der TO hat
ja wissen wollen, wie es geht. Und zwar ohne irgend einen ominösen
Bitconverter.
W.S.
W.S. schrieb:> Zuweisung zu schreiben und den Rest macht der Compiler. Aber der TO hat> ja wissen wollen, wie es geht. Und zwar ohne irgend einen ominösen> Bitconverter.
Der ist nicht "ominös", sondern sogar extrem gut dokumentiert. Was ihn
allerdings natürlich keinesfalls dagegen schützt, von Vollidioten falsch
benutzt zu werden...
Ist dann wie bei jeder anderen Software auch: Shit in->shit out.
c-hater schrieb:> Das Problem liegt also wohl in der Quelle, die benutzt offensichtlich> ein anderes Float-Format. Wenn die Bytes, die du geliefert hast,> überhaupt eine Float-Zahl darstellen.
Mir ist kein Float-Format bekannt, dass die selben Bytes wie int32
ergibt.