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%.
dynamisches array Offenbar geht es um verschiedene Anzahl von float-Werten.
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"...
:
Bearbeitet durch Moderator
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.