float in einem ascii speichern

Gast #5100221
Lesenswert?

Hallo,

ich habe einen float Wert, den ich gerne in einem String übertragen
möchte.
Der Vorteil des Strings wäre, dass ich einfach eine Reihe an Werten
aneinander schreiben könnte und immer mit dem String-Ende wüsste, wann
Schluss ist. Ich könnt also die vielen vorteilhaften String-Funktionen
nutzen und einfach viele Werte aneinander reihen.

Nun habe ich keine ftoa-Funktion verfügbar, und eigentlich ist der
Aufwand des hin und her wandelns auch relativ hoch, vor allem wo ich
keine Verwendung für die eigentlichen ASCII Werte habe, einzig möchte
ich ein paar Nummern innerhalb eines string Textes speichern.

Gibt es nicht einen Trick, mit dem man den float immer(!) so aussehen
lassen kann, als wäre es igendein ASCII Zeichen?

Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
Buchstaben und lande damit sicher innerhalb des ASCII-Alphabets, mit dem
Vorteil, dass ich den ASCII dann innerhalb meines Strings übertragen
könnte, ich müsst enur für jedenfloat ein Byte für den Nullterminator
spendieren.
Beim Rückwandeln subtrahiere ich und bekomme rundungsfrei den float Wert
zurück.

Kann das gehen?
#5100237
Lesenswert?

Stringent schrieb:
> Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
> Buchstaben und lande damit sicher innerhalb des ASCII-Alphabets,

Wie soll das gehen? Jede einzelne Stelle kann (von wenigen Ausnahmen 
abgesehen) den Wert 0..255 annehmen. Und die willst du mit einer simplen 
Addition eines fixen Werte eineindeutig auf 0x20..0x7F abbilden?

Die obige Antwort "Nein" sagt es kürzer :-)
Gast #5100239
Lesenswert?

Ein String überträgt doch beliebige Zeichen, außer 0.

Um 4 Byte also String zu übertragen bräuchtest Du mindestens 5 Werte 
0x01..0xff. Umwandlungen gibt es unendlich viele. Einfache, schwierige, 
lesbare oder kryptische. Was willst Du eigentlich wirklich?
Gast #5100325
Lesenswert?

Stringent schrieb:
> Der Vorteil des Strings wäre, dass ich einfach eine Reihe an Werten
> aneinander schreiben könnte und immer mit dem String-Ende wüsste, wann
> Schluss ist. Ich könnt also die vielen vorteilhaften String-Funktionen
> nutzen und einfach viele Werte aneinander reihen.

Und was ist an einem String besser als an einem float array?
Es kostet dich einen Haufen Konvertierzeit und eine ASCII-Darstellung 
verschwendet einen Haufen Speicherplatz.

Auch bei einem String musst irgendetwas haben, um die Länge zu 
kennzeichnen. Manche Programmiersprache verwendet ein 0x00 als letztes 
Byte, andere einen Längenzähler (bei Strings mit max 255 Zeichen, z.B. 
im ersten Byte).
Moderator (Firma: Titel) Persönliche Seite #5100356
Lesenswert?

Stringent schrieb:
> Kann das gehen?
Du solltest dir dringend mal die Grundlagen zur Zahlen- und 
Zeichendarstellung auf einem binären Rechner ansehen. Insbsondere auch 
das IEEE754 format.

> Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
> Buchstaben und lande damit sicher innerhalb des ASCII-Alphabets
Und auch die binäre Darstellung eines ASCII-Zeichens und dessen 
Wertebereich. Denn wenn ein Byte den Wert 0..255 haben kann, ein ASCI 
aber nur 0..127, was könntest du dann auf das Byte aufaddieren, um mit 
dem halben Wertebereich auszukommen (davon abgesehen sind die 
darstellbaren Zeichen bei ASCII noch weiter eingeschränkt).

Und am besten schaust du das mal aus der Sicht eines µC an. Dort sind 
das nämlich nur 8 (16, 32, ...) Bit breite 
Bithaufen/Vektoren/Register/Worte.

Und wie ein  00110010 00110000 00110001 00110111 zu interpretieren ist, 
das weiß ein µC von sich aus nicht. Erst die Abfolge des darauf 
zugreifenden Programms macht aus diesen Daten möglicherweise 
irgendwelche sinnvollen Dinge.
Diese 4 Bytes könnten z.b. vier unsigned 8-Bit werte mit 50, 48, 49 und 
55 sein. Oder sie könnten ain float mit dem Wert 1.02557385E-8 sein, 
oder die Zeichenkette "2017"...
Gast #5100814
Lesenswert?

Wolfgang schrieb:
> Auch bei einem String musst irgendetwas haben, um die Länge zu
> kennzeichnen. Manche Programmiersprache verwendet ein 0x00 als letztes
> Byte

Das hat zwar den Vorteil, dass solche nullterminierten Strings so lang 
werden können wie der Speicher gross ist (oder die Festplatte), aber

Stringent schrieb:
> Ich könnt also die vielen vorteilhaften String-Funktionen
> nutzen

Die sind nicht wirklich effektiv, weil man ja nicht wissen kann, wo die 
terminierende Null steht - bei einem 20 kByte langen String muss also 
schon allein die Funktion zur Längenbestimmung den ganzen String von 
vorne an bis zum Ende lesen. Für embedded Software sind solche Strings 
i.A. wenig geeignet.

Georg
Gast #5100851
Lesenswert?

Stringent schrieb:
> ich habe einen float Wert,

Und warum? Hat sich das irgendwie so ergeben, weil sich das bequem im 
Mikrocontroller programmieren lies oder gibt es einen ernsthaften Grund 
dafür?

Was ich sagen will, mit Integer-, Festkomma- und vergleichbaren 
Zahlenformaten fährt man in einem kleinen Mikrocontroller meist besser. 
Besonders, wenn man, wie du es andeutest, sich keine Wandelfunktionen 
leisten kann.

Also, geh noch mal in dich und frag dich, ob du wirklich float brauchst.

> den ich gerne in einem String übertragen
> möchte.
> Der Vorteil des Strings wäre, dass ich einfach eine Reihe an Werten
> aneinander schreiben könnte und immer mit dem String-Ende wüsste, wann
> Schluss ist.

Du müsstest dir schon überlegen, was euer dich ein "String-Ende" ist. 
0x0D 0x0A, 0x0A, 0x00 oder ähnliches.

> Ich könnt also die vielen vorteilhaften String-Funktionen
> nutzen und einfach viele Werte aneinander reihen.

Also für Stringfunktionen hast du Platz im Mikrocontroller?

> Nun habe ich keine ftoa-Funktion verfügbar,

Die ließe sich auftreiben. Wenn nicht in der Standard-Bibliothek für 
deinen Mikrocontroller und Compiler, dann als separate Bibliothek. Ein 
paar Hundert Zeilen Code für eine Wandlunge mit ein paar Vereinfachungen 
dürften es schon sein.

> Gibt es nicht einen Trick, mit dem man den float immer(!) so aussehen
> lassen kann, als wäre es igendein ASCII Zeichen?

Nicht ein einzelnes Zeichen. Acht ASCII-Zeichen gehen sehr leicht. Dazu 
wandelt man jedes der vier einzelnen Bytes eines float in eine 
zweistellige  Hex-Darstellung um. Code fuer das Wandeln eines Bytes nach 
Hex gibt es wie Sand am Meer.

> Idee wäre, ich addiere auf alle 4 Byte jeweils irgendeinen fixen
> Buchstaben

> Kann das gehen?

Nein.

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