Forum: Mikrocontroller und Digitale Elektronik Ausgabe vin Hex Zahlen mit sprintf()


von Gerd (Gast)


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

von Frank B. (f-baer)


Lesenswert?

sprintf(string, "%x", hexwert);

Belese dich am besten über Formatierungsmöglichkeiten mit 
printf-Funktionen:
http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/format.html

von MaWin (Gast)


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.

von Karl H. (kbuchegg)


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 );

von Gerd (Gast)


Lesenswert?

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!

von Martin B. (Gast)


Lesenswert?

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;
}

von Axel S. (a-za-z0-9)


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

von Gerd (Gast)


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!

von DirkB (Gast)


Lesenswert?

Wie ist denn out definiert?

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.