Forum: Mikrocontroller und Digitale Elektronik Hexadezimalwert in eine Zeichenkette umwandeln


von Franz (Gast)


Lesenswert?

Hallo,

ich möchte gerne eine 32 Bit Variable in eine Zeichenkette umwandeln.

uint32_t = 0X00000123;

Die Funktion "atoi" liefert zwar den passenden Dezimalwert als char
,hier 291.

Ich möchte aber gerne den urpsrünglichen Wert als hex Zahl über UART 
ausgeben, also "0X00000123"

Hat da irgendjemand eine Idee wie man das macht ?

Viele Grüße

von Nop (Gast)


Lesenswert?

Entweder nimmst Du printf, wenn Du den Overhead an Speicher und 
Rechenzeit verkraften kannst, oder Du konvertierst das halbbyteweise 
selber.

von Martin O. (ossi-2)


Lesenswert?

sprintf mit format-specifier X, Irgendwie so: sprintf("0X%08X",x)

von Walter S. (avatar)


Lesenswert?

Franz schrieb:
> Die Funktion "atoi" liefert zwar den passenden Dezimalwert als char
> ,hier 291.

hmm, da verwechselst du einiges

atoi(0x123)
sollte erst eine Compilerwarnung erzeugen und wenn man das ignoriert 
wird es sehr sehr wahrscheinlich nicht 291 zurückgeben

von Franz (Gast)


Angehängte Dateien:

Lesenswert?

Walter S. schrieb:
> Franz schrieb:
>> Die Funktion "atoi" liefert zwar den passenden Dezimalwert als char
>> ,hier 291.
>
> hmm, da verwechselst du einiges
>
> atoi(0x123)
> sollte erst eine Compilerwarnung erzeugen und wenn man das ignoriert
> wird es sehr sehr wahrscheinlich nicht 291 zurückgeben

Bei mir steht 291 hex codiert drin.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nop schrieb:
> oder Du konvertierst das halbbyteweise selber.
Ich habe da dort ein paar Betrachtungen dazu:
http://www.lothar-miller.de/s9y/archives/94-String-als-Tabelle-in-C.html

Franz schrieb:
>> wird es sehr sehr wahrscheinlich nicht 291 zurückgeben
> Bei mir steht 291 hex codiert drin.
Da steht hex x33, x39 und x31 drin. Das was du markiert hast, ist das 
ASCII-Zeichen, das diesen Hex-Wert hat.

von Franz (Gast)


Lesenswert?

hahaha sry ich meinte itoa

von Thomas S. (thschl)


Lesenswert?

kannst deinen String auch so basteln, musst nur auf long gehen, also 
verdoppeln oder wenn kürzer dann in eine Schleife legen

void HexShortToString(uint8_t *puc_String,
                      uint16_t us_Wert)
{
    const uint8_t uc_HexZiffer[] = {"0123456789ABCDEF"};
    uint8_t *puc_Ptr;

    puc_Ptr = puc_String;
    *puc_Ptr = uc_HexZiffer[((us_Wert >> 12) & 0x0F)];
    puc_Ptr++;
    *puc_Ptr = uc_HexZiffer[((us_Wert >>  8) & 0x0F)];
    puc_Ptr++;
    *puc_Ptr = uc_HexZiffer[((us_Wert >>  4) & 0x0F)];
    puc_Ptr++;
    *puc_Ptr = uc_HexZiffer[((us_Wert) & 0x0F)];

} /* ende HexShortToString */

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


Lesenswert?

Franz schrieb:

> ich möchte gerne eine 32 Bit Variable in eine Zeichenkette umwandeln.
>
> uint32_t = 0X00000123;
>
> Die Funktion "atoi" liefert zwar den passenden Dezimalwert als char

Nein.

> Ich möchte aber gerne den urpsrünglichen Wert als hex Zahl

Dann mach es doch.

Franz schrieb:
> sry ich meinte itoa

Ja. Eben. Und jetzt liest du dir nochmal durch, wie du itoa (je nach 
Plattform für uint32_t wohl eher utoa() bzw. ultoa()) aufrufen mußt. 
Insbesondere was der dritte Parameter radix bedeutet.

<kopfschüttelnd>

von Dirk B. (dirkb2)


Lesenswert?

Franz schrieb:
> hahaha sry ich meinte itoa

itoa gehört nicht zum C-Standard.

Es gibt auch Versionen, denen kannst du die Basis der Darstellung als 
Parameter mitgeben.
Wenn dein itoa es nicht kann, ist es eine nette Übung (es selber zu 
machen oder danach zu suchen)

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.