Hallo zusammen, nachdem mir die Suchfunktion nicht besonders geholfen hat frag ich mal nach. Ich möchte lediglich ein Byte (uint) als Hexadezimal Zahl im String speichern um es anschließend ausgeben zu können. Da ich mit einem PIC arbeite kann ich leider nicht einfach itoa mit Radix nutzen, da der Pic es nicht unterstütz. Also im Prinzip variable wandeln in Hex --> in String wandeln --> Ausgeben. Bei mir harperts an dem Klammerninhalt. Ich habe jetzt schon verschiedene Seiten in denen die Funktion erklärt ist, jedoch werden bei mir nach wie vor Dezimalzahlen ausgegeben oder z.T. Dezimalzahlen mit einen ? dahinter. Zum Teil auch ganz wirres Zeug oder garnichts. Ich habe jetzt schon etwas rumprobiert. Ich bin für jede Hilfe dankbar
sprintf(string, "%x", hexwert); Belese dich am besten über Formatierungsmöglichkeiten mit printf-Funktionen: http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html
Ein Char buffer[4]; Uint wert; //0..255 Sprintf(Buffer,"%x",Wert); Sollte es tun, aber natürlich ist es ziemlich blöd, die grosse Funktion sprintf einzubinden und den Format-String analysieren zu lassen, wenn man nur die eine dahinterliegende Funktion braucht, auch wenn die diesmal nicht itoa heisst.
Gerd schrieb: > Hallo zusammen, > > nachdem mir die Suchfunktion nicht besonders geholfen hat frag ich mal > nach. > > Ich möchte lediglich ein Byte (uint) als Hexadezimal Zahl im String > speichern um es anschließend ausgeben zu können. Da ich mit einem PIC > arbeite kann ich leider nicht einfach itoa mit Radix nutzen, da der Pic > es nicht unterstütz. Echt? Da die Funktion eigentlich recht einfach ist, wundert mich das aber. Allerdings ist itoa keine Standardfunktion (ganz im Gegensatz zu atoi). Es könnte daher sein, dass die Funktion auf deinem Compiler konformerweise zb _itoa heißt. > Also im Prinzip variable wandeln in Hex --> in String wandeln --> > Ausgeben. > > Bei mir harperts an dem Klammerninhalt. Ich habe jetzt schon > verschiedene Seiten in denen die Funktion erklärt ist, jedoch werden bei > mir nach wie vor Dezimalzahlen ausgegeben Das kann aber eigentlich nicht sein. Denn wenn du die Funktionalität con Dezimalausgabe auf HExadezimalausgabe umgestellt hast, dann können da auch keine Dezimalzahlen mehr rauskommen. > einen ? dahinter. Zum Teil auch ganz wirres Zeug oder garnichts. Ich > habe jetzt schon etwas rumprobiert. Weniger rumprobieren und mehr systematisch vorgehen. Aber wenn du sowieso sprintf benutzt, warum benutzt du dann nicht ganz einfach die %x Format Spezifizierung? sprintf( buffer, "%x", variable );
Hatte die Seite auch schon gefunden: http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html#width Allerdings war bei mir die anordnung in der Klammer falsch. Nunja jetzt Funktioniert es. Vielen Dank für die schnelle und unkomplizierte Hilfe!
oder so? char *xtoa(char val, char *str) { char *z="0123456789abcdef"; str[0] = z[val >> 4 & 0x0f]; str[1] = z[val & 0x0f]; str[2] = 0x0; return str; }
Martin B. schrieb: > oder so? > > char *xtoa(char val, char *str) > { > char *z="0123456789abcdef"; ... Die 16 Bytes RAM muß man nicht verschwenden wenn man es so macht:
1 | void hexout(uint8_t x) |
2 | {
|
3 | register uint8_t d= (x>>4) & 0x0F; |
4 | lcd_putc(d + (d>9 ? 'A'-10 : '0')); |
5 | d= x & 0x0F; |
6 | lcd_putc(d + (d>9 ? 'A'-10 : '0')); |
7 | }
|
Den Krempel mit String-Buffer allozieren und anhängen überlasse ich dem TE zur Übung. XL
Ich möchte die Ausgabe nun noch dahingehend erweitern das mir immer zwei Stellen angezeigt werden: Also 0x00 Wenn ich nun z.B. eine 0x05 sende, wird sie mir als 0x5 angezeigt ich hätte es aber lieber in dem format 0x05. ich nutze standmäßig diesen befehl: sprintf(out[0][2]," %#x \n",Ausgabe); habe diesen dann nach der Anleitung --> http://home.fhtw-berlin.de/~junghans/cref/FUNCTION... modifiziert und habe folgenden Befehl benutzt: sprintf(out[0][2]," %04#x \n",Ausgabe); Eigentlich sollten jetzt 4 Stellen für die Ausgabe reserviert sein und die Leerzeichen mit 0 ausgefüllt werden. (So wie ich das interpretiere) Ich bekomme allerdings nurnoch ein "x" ausgegeben. Ich denke ich habe irgendwo einen grundsätzlichen Denkfehler. Vielleicht hat von euch einer eine idee.. Dankeschön!
Gerd schrieb: > habe diesen dann nach der Anleitung --> > http://home.fhtw-berlin.de/~junghans/cref/FUNCTION... > > modifiziert und habe folgenden Befehl benutzt: > > sprintf(out[0][2]," %04#x \n",Ausgabe); Wenn du mal auf der Webseite GENAU schaust, dann siehst du, dass dort der # beim % bleibt. Ob allerdings dein PIC # überhaupt unterstützt, ist eine andere Frage. Probier mal
1 | sprintf(out[0][2]," %#04x \n",Ausgabe); |
Wenn das nicht geht, dann eben auf die alte klassische Methode, indem du das "0x" einfach selber hinschreibst.
1 | sprintf(out[0][2]," 0x%04x \n",Ausgabe); |
Letztere Version ist IMHO sowieso zu bevorzugen, denn laut deiner Doku
1 | %#x (Hex) 0x Präfix wird bei Werten ungl. Null eingefügt. |
man beachte das 'ungleich 0'. Das ist eher selten sinnvoll.
DirkB schrieb: > Wie ist denn out definiert? Das würde mich allerdings auch interessieren. Denn in einer so allgemeinen Funktion ein 3-dimensionales Array zu benutzen, ist reichlich ungewöhnlich.
Gerd schrieb: > sprintf(out[0][2]," %#x \n",Ausgabe); > sprintf(out[0][2]," %04#x \n",Ausgabe); Was soll da das #? sprintf(out[0][2]," %04x \n",Ausgabe); sollte besser funktionieren -- wenn "out" funktioniert. DirkB schrieb: > Wie ist denn out definiert? Die Frage ist hier nicht unwichtig.
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.