Forum: Compiler & IDEs C-Beginner HEX 2 ACII


von Markus (Gast)


Lesenswert?

hi
hat jemand ne idee wie ich in c am besten eine hex Zahl in ein ACII 
zeichen wandeln kann? es geht sich eigentlich nur um Zahlen
0-255.

von Notker (Gast)


Lesenswert?

uint8_t bin2asc(uint8_t byte,uint8_t hi)
{
        if(hi)
                byte >>= 4;
        else
                byte &= 0x0f;
        if(byte>9)
                byte += 0x37;
        else
                byte += 0x30;
        return(byte);
}

Wandelt jeweils das nieder- bzw. höherwertige Nibble eines Bytes in ein 
druckbares Hex-Zeichen (ASCII) um. Muss also zur Umwandlung eines Bytes 
zweimal aufgerufen werden.

von Markus (Gast)


Lesenswert?

mhh..dann muss ich also erst mein byte in high und low zerlegen und dann 
übergeben?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

@Markus: Du willst ein Byte hexadezimal darstellen, habe ich das richtig 
verstanden?

Notker's Funktion rufst du einmal mit
  zeichen1 = bin2asc(zahl, 0);
auf (dann bekommst du das erste Zeichen) und das zweite Mal mit
  zeichen2 = bin2asc(zahl, 1);
(zweites Zeichen).

Finde ich etwas umständlich, ich würde es so machen (evtl. mit #define 
in ein Makro packen):

zeichen = zahl + ((zahl > 9) ? 0x37 : 0x30);

Wandelt eine Zahl <= 0xF in das entsprechende Zeichen um. Bei ganzen 
Bytes brauchst du natürlich wieder 2 Zeichen, also:

zeichen1 = zahl + (((byte & 0xF) > 9) ? 0x37 : 0x30);
zeichen2 = zahl + (((byte >> 4) > 9) ? 0x37 : 0x30);

von Markus (Gast)


Lesenswert?

erstmal besten dank für eure schnelle hilfe.
also deine lösung andreas finde ich super...:)...
da ich aber noch wenig erfahrung mit C habe weiss ich nicht welche wohl 
die bessere lösung ist. also mit der lösung von unten könnte man jetzt 
sogar einen long int umwandeln.

noch ne frage..was ist true und was ist false hinter dem fragezeichen. 
meiner logik nach müsste der linke der true fall sein.


extern void lcdputnum(unsigned char number)
{
    unsigned char i;

    if (number <= 9)
    {
        i = 0x30 + number;
        lcdputchar(i);
    }

    if (number >= 10 && number <= 99)
    {
        i=number/10;lcdputchar(i+0x30);number-=(i*10);
        lcdputchar(number+0x30);
    }

}

von BAB (Gast)


Lesenswert?

mit der lösung von andreas ist nach einem byte ende.
mit deiner kann man jetzt mehr auflösen.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

@Markus: Links vom Doppelpunkt steht das Ergebnis für true, rechts davon 
das für false.

@BAB: Nein. Der Unterschied ist, dass Markus' Version keine Hexadezimal- 
sondern eine Dezimalzahl anzeigt. Die Funktion nimmt auch nur unsigned 
char als Parameter.

von BAB (Gast)


Lesenswert?

oops sorry hatte mich wohl verschaut...
mit mehr meinte ich übrigens das man die version oben leicht erweitern 
kann und zb zu einer int oder long ing oder sonstigen funktion umbauen 
kann.

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.