Moin, ich bekomm es einfach nicht hin 4 ASCII Zeichen in eine Float-Zahl umzuwandeln. Kennt einer zufällig eine einfache Lösung.
Würde es Dir etwas ausmachen, zu beschreiben, was Du erreichen willst? Könntest Du ein Beispiel geben? Welche Zeichenfolge soll welchen float-Wert ergeben?
4 Byte beschreibt eine Floatzahl, diese 4 Byte hab ich als String vorliegen. Jetzt möchte ich einfach nur die 4 Byte als Floatzahl darstellen und wieder in einen neuen String schreiben. Hab grad die Funktion atof gefunden, bin mir etwas unsicher ob die mir wirklich hilft.
> 4 Byte beschreibt eine Floatzahl, diese 4 Byte hab ich als String > vorliegen. Jetzt möchte ich einfach nur die 4 Byte als Floatzahl > darstellen und wieder in einen neuen String schreiben. Ja, soweit haben wir es verstanden. Aber so wie du es beschrieben hast, lässt es zwei Interpretationen zu: 1) String "1234" -> float 1234 2) String "1234" -> 0x31323334 -> float 825.373.492 Also wat nu? Ralf
1 | uint8_t ascii[] = "abcd"; |
2 | float f = *(float*)(&ascii[0]); |
oder:
1 | uint8_t ascii[] = "3.14"; |
2 | float f = atof( ascii ); |
... je nachdem
ich hab es als "ABCD" vorliegen und will das in einen String der Floatzahlen enthält umwandeln ("1.5467x10^1") Wenn ich mich nicht irre war ja das MSB das Vorzeichenbit und die letzten 8 Bit beschreiben die Exponenten. Naja, ich glaube ihr habt meine Frage schon beantwortet. Danke.
ok, also hast du in den 4 Byte die Binärdarstellung der float. Dann entfällt die Variante mit atof(); es bleibt die Zeigergeschichte. Nach meinem Vorschlag hast du jetzt aber erstmal nur die float in der Variablen f. Wenn du die noch in einen String konvertieren willst, geht das z.B. mit sprintf():
1 | uint8_t ascii[] = "abcd"; |
2 | float f = *(float*)(&ascii[0]); |
3 | char zielpuffer[20]; |
4 | sprintf( zielpuffer, "%g", f ); |
Das erzeugt jetzt nicht das Format 1.5467x10^1, sondern 1.5467E001 oder so etwas in der Art, aber das sollte wohl auch passen.
vielen Dank für die Anworten, eine kleine Frage hätte ich noch. uint8_t gibts bei DEV C++ nicht, weiss einer wie es zufällig dort heisst
Das sollte es dort auch geben, such mal nach inttypes.h oder stdint.h Wenn es es tatsächlich nicht geben sollte: unsigned char
Noch ein kleiner Hinweis: je nach Zielarchitektur könnte
1 | uint8_t ascii[] = "abcd"; |
2 | float f = *(float*)(&ascii[0]); |
einen Fehler hervorrufen, weil der string ascii an jeder beliebigen Position stehen kann, der Pozessor bei der Zuweisung des Floats aber eventuell eine auf 4 alignte Adresse erwartet. Falls das der Fall ist, sollte man alle 4 Bytes einzeln zuweisen, also
1 | ((uint8_t*)&f)[0] = ascii[0]; |
2 | ((uint8_t*)&f)[1] = ascii[1]; |
3 | ((uint8_t*)&f)[2] = ascii[2]; |
4 | ((uint8_t*)&f)[2] = ascii[3]; |
MfG Mark
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.