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?
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 :-)
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?
Stringent schrieb:> und einfach viele Werte aneinander reihen
Wir wissen nicht, was der freundliche Tankwart empfiehlt, aber ich
empfehle zur einfachen Aneinanderreihung von float-Werten ein
float-Array.
Schau dir mal Base64 an. Damit werden immer 3 Byte zu 4 Ascii-Zeichen
kodiert. Das ganze kannst du mit beliebig vielen Bytes machen hat aber
auch immer einen Overhead von mindestens 33%.
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).
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"...
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
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.