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.
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.
mhh..dann muss ich also erst mein byte in high und low zerlegen und dann übergeben?
@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);
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); } }
mit der lösung von andreas ist nach einem byte ende. mit deiner kann man jetzt mehr auflösen.
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.