hex in integer

Gast #2658983
Lesenswert?

Hallo.

Ich brauche eine Funktion um eine Konvertierung von Hex in Dec und 
umgekehrt durchzuführen.
Also genauer ein 2stelliges chararray in eine Intvariable und eben auch 
andersrum.
Gegoogelt habe ich natürlich auch schon und bin dabei auf die Funktionen 
itoa und atoi gestoßen.
Mit itoa funktionierts aber mit atoi leider nicht.
Außerdem habe ich noch xtoi und itox gefunden, aber anscheinend muss man 
sich die selber schreiben?

Was kann ich denn nun benutzen und wie?

Freundliche grüße, torsten
Gast #2659011
Lesenswert?

Danke schonmal, war zum einen ein Verständigungsproblem.
Ich dachte das itoa die "umkehrfunktion" von atoi ist.
Mit itoa bekommt man ja einen hexadezimalen Wert.
Aber anscheinend kann man das mit atoi nicht umkehren.

Mit der Adresse übergeben wäre nicht das Problem, ich dachte nur 
einfach, dass ich atoi einfach einen hexadezimal wert geben kann und 
daraus ein int wert, mehr wollte ich nicht. Wie bewerkstellge ich nun 
das?

Danke, torsten
Gast #2661085
Lesenswert?

Ich denke es wird von dir verlangt dies ohne library Funktionen zu 
lösen.
Überprüfe ob das erste char im bereich 0x30 bis 0x39 liegt (also ASCII 
von 0-9). Wenn nicht könnte es sein das es im Bereich A-F liegt. Und das 
wäre welcher ASCII Wert ? Tipp schau mal in eine ASCII Tabelle.

Wenn du dies getan hast kannst du falls es im Bereich von 0x30-0x39 
liegt einfach 0x30 subtrahieren und um 4 Bit nach Links schieben.

Was machst du nun mit dem nächsten char ?

Wieso habe ich um 4 Bit nach links geschoben ?

Wieviele einzelne Ziffern ergeben 1 Byte in Hexadezimal ?
#2661166
Lesenswert?

Uwe schrieb:
> Ich denke es wird von dir verlangt dies ohne library Funktionen zu
> lösen.
> Überprüfe ob das erste char im bereich 0x30 bis 0x39 liegt (also ASCII
> von 0-9). Wenn nicht könnte es sein das es im Bereich A-F liegt. Und das
> wäre welcher ASCII Wert ? Tipp schau mal in eine ASCII Tabelle.

Zur Übung ist der Tip nicht so schlecht.
Für die Programmierung ist das aber ein schlechter Tip. Kein Mensch muss 
die ASCII Codes auswendig können. Die kennt der Compiler nämlich auch 
und anstelle von 0x30 kannst du ruhig auch '0' hinschreiben. Dann
* sieht jeder, dass es hier um das Zeichen '0' geht
* muss keiner ASCII Tabellen wälzen um zu sehen, dass 0x30 für das
  Zeichen '0' steht.

Auch wenn es überrasschend sein mag: In C kann, darf und soll man mit 
Charactern Arithmetik betreiben (*)

   Wert = Zeichen - '0';

ist völlig legal und gleichwertig zu

   Wert = Zeichen - 0x30;

Nur eben mit dem Unterschied, das in der ersten Version ziemlich klar 
ist, was die Absicht war.

  if( Zeichen >= '0' && Zeichen <= '9' )

ist dann doch ein wenig leichter zu verstehen, als

  if( Zeichen >= 0x30 && Zeichen <= 0x39 )


(*) Das ist: solange man sich im 7-Bit Ur-ASCII Raum bewegt. Erst wenn 
das MSB eines Zeichens gesetzt ist (Sonderzeichen wie Umlaute) wird es 
unter Umständen spannend ob der Compiler einen char nun signed oder 
unsigned auffasst. Dann ist man mit der Hex-Schreibweise unter Umständen 
besser bedient.
Gast #2661197
Lesenswert?

Wenn einem erst einmal bewußt ist, daß die ASCII Zahlen hintereinander 
in der Tabelle stehen dann versteht man auch den Sinn. Genauso wie die 
Buchstaben a-z bzw. A-Z. War nur als Denkanstoß für torsten gedacht.
Noch was torsten :
1. Wieviele ASCII Zeichen werden denn benötigt um eine 32Bit Integer 
vollständig zu beschreiben ?
2. Wieviel Bytes werden denn benötigt um eine 32Bit Integer vollständig 
zu beschreiben ?
#2661215
Lesenswert?

Uwe schrieb:
> Wenn einem erst einmal bewußt ist, daß die ASCII Zahlen hintereinander
> in der Tabelle stehen dann versteht man auch den Sinn.

Drum sag ich ja:
Als Tip, als Denkanstoss: nicht schlecht.
Aber für die Programmierung nicht notwendig.


Leider sieht man das allzuoft
   if( c == 0x3A )    // war das Zeichen ein :

schreib doch gleich im Code hin was du meinst
   if( c == ':' )

es gibt keinen Grund es nicht zu tun.

Sowas sollte man sich von Anfang an gleich gar nicht eingewöhnen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren