Forum: Mikrocontroller und Digitale Elektronik Umwandlung von ASCII in Hex, Dez oder Bin


von Stefan S. (stefan0784)


Lesenswert?

Hi Mikrocontrollers,

ich habe ein Problem. (Sonst wär ich ja auch nicht im Forum :-) )
Problemstellung:
Ich habe einen At89C51CC03 als Controller. Dieser empfängt über UART ein 
Datenbyte das auf der ASCII Tabelle zwischen  ! = 0x21 und  ~ = 0x7E 
liegt.
Dieses Zeichen muss ich folgendermassen umwandeln.


1. in den Binär-Wert wobei ich jede einzelne Binär_Zahl einzeln ausgeben 
muss. Bsp.: 11100010  a[0] = '1'; a[1] = '1'; ....; a[6] = '1'; a[7] = 
'0'

2. in den DezimalWert. Bsp.: 0x33 = '3' = 51
   Ausgabe a[0] = 5; a[1] = 1

3. in den Hex-Wert. Bsp.: ASCII Zeichen = '7' = 0x55.
   Ausgabe a[0] = '0'; a[1] = 'x'; a[2] = '5'; a[3] = '5'

Hab mir für die Binärumwandlung selber einen Code geschrieben. Jedoch 
ist der Riesengroß und mit hunderten von if Abfragen.
Jetzt die Frage an euch. Hat einer eine Funktion dafür schon mal 
entwickelt oder gibts ne Bibliothek?
Habs jetzt schon mit printf und Co. probiert. Ich komm aber nie aufs 
richtige Ergebnis.
Die Umwandlung von int in ASCII oder hex funktioniert einwandfrei - 
jedoch andersrum krieg ich es nicht gebacken.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Die "bits" erhälst du z.b. so: (Pseudocode!)
1
for (int i = 0; i <8 ; i++) {
2
 char c;
3
 if (input & (1<<i) {
4
  c = '1';
5
 } else {
6
  c = '0';
7
 }
8
}

Den dezimalwert erhälst du durch teilen durch 10 mit rest (da kommst du 
sicher selbst drauf funktioniert gaaaaanz normal wie schriftliches 
rechnen in der Schule....

Bei Hex gehts so:
1
 char c1, c2;
2
 c1 = getHex(input & 0x0F);
3
 c2 = getHex(input >> 4 &0x0F);
4
5
 char getHex(int i) {
6
  if (i < 9) {
7
   return '0'+i;
8
  }
9
  return 'A'+(i-10);
10
 }

von Stefan S. (stefan0784)


Lesenswert?

Perfekt.
Funktioniert einwandfrei.
Vielen Dank für die wie immer schnelle Hilfe im Forum!

von Jan (Gast)


Lesenswert?

Hallo,
muss ein C Programm schreiben das ein ASCII Zeichne einliest und 
anschließend das Zeichen, den Dezimalwert des Zeichens, den 
Hexadezimalen Wert des Zeichens und den binären Wert des Zeichens 
ausgibt.
Habe allerdings Schwierigkeiten mit der Ausgabe der Hex und Bin werte. 
Gibts dafür nen ähnlichen Befehl wie für die Dezimalwerte (%d)

Quasi:
...
int a;
a=_getche ();
printf("Zeichen: %c \n Dezimalwert: %d \nHEXwert: ??? \n BINwert: 
???",a,a,a,a);
...
...

von Gast (Gast)


Lesenswert?

%x

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und eine Binärdarstellung musst Du Dir selber bauen, dafür gibt es 
keinen Formatspezifizierer.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Btw: Es könnte sein, dass bei einigen Compilern für Microprozessoren 
nicht der volle Formatzeichensatz von printf vorhanden ist, oder dieser 
erst durch linken von speziellen Bibliotheken oder durch Schalter 
ausgewählt werden muss.

von Hc Z. (mizch)


Lesenswert?

Gibt es eigentlich schon einen Hausaufgaben-Löser-Tarif für's Forum?

Kostenloser Tipp: itoa(), utoa(), ltoa() etc.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Das trifft aber nur für die Umwandlung eines Integers in einen String 
zu.

von Hc Z. (mizch)


Lesenswert?

Die Hausaufgabe nannte ein "ASCII-Zeichen".  Probleme, daraus ein int zu 
erhalten?  Nicht wirklich?

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.