4 ASCII Zeichen in Float

Gast #1347231
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.
Gast #1347255
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
Gast #1347278
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.
#1347281
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.
#1347449
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren