www.mikrocontroller.net

Forum: PC-Programmierung 4 ASCII Zeichen in Float


Autor: Gast (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach, die Sprache ist C

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t    ascii[] = "abcd";
float      f = *(float*)(&ascii[0]);
oder:
uint8_t    ascii[] = "3.14";
float      f = atof( ascii );

... je nachdem

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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():
uint8_t    ascii[] = "abcd";
float      f = *(float*)(&ascii[0]);
char       zielpuffer[20];
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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein kleiner Hinweis:

je nach Zielarchitektur könnte
uint8_t    ascii[] = "abcd";
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
((uint8_t*)&f)[0] = ascii[0];
((uint8_t*)&f)[1] = ascii[1];
((uint8_t*)&f)[2] = ascii[2];
((uint8_t*)&f)[2] = ascii[3]; 

MfG Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.