Forum: PC-Programmierung 4 ASCII Zeichen in Float


von Gast (Gast)


Lesenswert?

Moin, ich bekomm es einfach nicht hin 4 ASCII Zeichen in eine Float-Zahl 
umzuwandeln. Kennt einer zufällig eine einfache Lösung.

von Gast (Gast)


Lesenswert?

ach, die Sprache ist C

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Gast (Gast)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

> 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

von Klaus W. (mfgkw)


Lesenswert?

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

von Gast (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sollte es dort auch geben, such mal nach inttypes.h oder stdint.h

Wenn es es tatsächlich nicht geben sollte:

unsigned char

von Mark .. (mork)


Lesenswert?

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
Noch kein Account? Hier anmelden.