Ausgabe vin Hex Zahlen mit sprintf()

Gast #3242710
Lesenswert?

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
Gast #3242721
Lesenswert?

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.
#3242723
Lesenswert?

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 );
#3243780
Lesenswert?

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
Gast #3246992
Lesenswert?

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!
#3247008
Lesenswert?

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.

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