Forum: Compiler & IDEs Ausgabe als hex-Wert


von Jens (Gast)


Lesenswert?

Hi,

ich möchte eine Integer Variable als 4 stelligen Hex-Wert über die UART 
ausgeben. Wie programmiere ich das am Besten in c?

von Klaus W. (mfgkw)


Lesenswert?

1
    char puffer[5];
2
    snprintf( puffer, 4, "%04X", meinWert );
3
    // dann puffer ausgeben...
oder itoa() bzw. utoa() verwenden, und die Stellenanzahl von Hand 
hinbiegen.

von Klaus W. (mfgkw)


Lesenswert?

Zumindest ist das der übliche Weg.

Man könnte auch die UART zur Standardausgabe machen, dann kann man ohne 
Umweg über einen Puffer direkt z.B. mit printf() schreiben.

von Jens (Gast)


Lesenswert?

Danke!
Wie könnte ich es mit itoa() machen? Wäre das schneller, oder besser?

von Klaus W. (mfgkw)


Lesenswert?

Die printf-Funktionen brauchen viel Code und sind relativ langsam.

Jens schrieb:
> Wie könnte ich es mit itoa() machen? Wäre das schneller, oder besser?

Doku lesen: http://www.nongnu.org/avr-libc/user-manual/index.html

itoa() liefert soviele Stellen, wie nötig.
Ggf. musst du halt auf deine 4 Stellen auffüllen.

Dafür ist itoa() sehr sparsam im Vergleich zu snprintf().
Wenn du in deinem Programm aber eh die printf-Dinger brauchst, kannst du 
sie hier auch gleich verwenden. Von der zweiten Verwendung an blähen sie 
das Programm ja nicht mehr weiter auf

von Klaus W. (mfgkw)


Lesenswert?

Wahrscheinlich brauchst du aber eher utoa(), weil ich bei "hex" erstmal 
von unsigned ausgehe. itoa() ist für signed.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> itoa() liefert soviele Stellen, wie nötig.

Andersrum formuliert: Keine führenden Nullen.

von Jens (Gast)


Lesenswert?

Hallo,
könnte wer von euch mal drüberschauen, ob der Code so in Ordnung ist?
DANKE!

Gegeben Integervariable value;
1
unsigned int valueL, valueH;
2
unsigned char nibble1;
3
unsigned char nibble2;
4
unsigned char nibble3;
5
unsigned char nibble4;
6
unsigned char hextable[] = { '0','1','2'.
7
                             '3','4','5'.
8
                             '6','7','8',
9
                             '9','A','B',
10
                             'D'.'E','F', };
11
12
valueL = value;
13
valueH = value >> 8;
14
15
16
nibble1 = hextable[ ( valueH & 0xF0 ) >> 4) ];
17
nibble2 = hextable[ ( valueH & 0x0F) ];
18
nibble3 = hextable[ ( valueL & 0xF0 ) >> 4) ];
19
nibble4 = hextable[ ( valueL & 0x0F) ];
20
21
putchar(nibble1); putchar(nibble2);putchar(nibble3); putchar(nibble4);

von DirkB (Gast)


Lesenswert?

Da nibbleX und hextable[] Zeichen enthalten, sollten sie vom Typ char 
(nur char, kein signed/unsigned) sein.
Und es ist besser erst zu verschieben und dann zu maskieren.

von Klaus W. (mfgkw)


Lesenswert?

Wenn man um 4 nach rechts schiebt, braucht man vorher nicht zu 
maskieren.

Kompilierbar ist es eh nicht, alleine wegen der Punkte in der Tabelle.

von Holger W. (holgerw)


Lesenswert?

irgendwo hatte ich sowas gefunden:
1
unsigned char nibble;
2
unsigned char hex0,hex1;
3
  
4
    nibble = (data & 0xf0) >> 4;
5
    hex0 = (nibble < 10) ? ('0' + nibble) : ('a' + nibble - 10);
6
 
7
    nibble = (data & 0x0f);
8
    hex1 = (nibble < 10) ? ('0' + nibble) : ('a' + nibble - 10);

Holger

edit: auch hier könnte das erste maskieren entfallen

von Stefan (Gast)


Lesenswert?

Jens schrieb:
> unsigned char hextable[] = { '0','1','2'.
>                              '3','4','5'.
>                              '6','7','8',
>                              '9','A','B',
>                              'D'.'E','F', };

Wo ist 'C' ???

Gruss Stefan

von DirkB (Gast)


Lesenswert?

Das ist alles C.

Wenn es vom C-Compiler ohne Fehler übersetzt wird, ist es C. :-)

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.