char to hex to int

#3599602
Lesenswert?

Hallo,

ich versuche einen Array von chars(z.B.: x = ['A', 'B', 'C', '1', 'F', 
'F']) in eine die Äquivalente Dezimalzahl umzuwandeln. Also F soll 
später 16 sein, B soll 11 sein usw.. atoi und der gleichen hilf mir ja 
nicht weiter, denn die geben mir nur die ASCII hex zahl z.B.: F ist dann 
41, was nicht so soll. Welche Methode gibt es dafür?
#3600808
Lesenswert?

DirkB schrieb:
> Um welche Programmiersprache geht es denn dabei?
Da der Thread im "GCC" Forum ist vermutlich C.
In C würde ich es so machen:
1
char character='B', zahl;
2
//....
3
//....
4
if(character<='9')
5
  zahl=character-'0';
6
else
7
  zahl=character-'A';   //oder zahl=character-'a'; wenn du mit Kleinbuchstaben arbeitest

Wenn du dir eine ASCII-Tabelle ansiehst kannst du den Code vllt. 
nachvollziehen:
http://neubert-volmar.de/Omega/Handbuch/ASCII-Tabelle.bmp
#3600832
Lesenswert?

Jürgen D. schrieb:
> Groß und Kleinbuchstaben unterscheiden sich nur durch ein Bit.
> Mit 0x20 "verodern" und man hat immer Kleinbuchstaben
Wusste ich noch nicht, habe mich noch nie so sehr mit ASCII beschäftigt. 
Werd ich mir merken, Danke :-)

Der Code würde dann so aussehen:
1
char character='B', zahl;
2
//....
3
//....
4
if(character<='9')
5
  zahl=character-'0';
6
else
7
  zahl=(character|0x20)-'a';
#3600853
Lesenswert?

Max H. schrieb:
> Jürgen D. schrieb:
>> Groß und Kleinbuchstaben unterscheiden sich nur durch ein Bit.
>> Mit 0x20 "verodern" und man hat immer Kleinbuchstaben
> Wusste ich noch nicht, habe mich noch nie so sehr mit ASCII beschäftigt.
> Werd ich mir merken, Danke :-)
>
> Der Code würde dann so aussehen:
>
1
> char character='B', zahl;
2
> //....
3
> //....
4
> if(character<='9')
5
>   zahl=character-'0';
6
> else
7
>   zahl=(character|0x20)-'a';
8
>


Fast.
Ich würde im Buchstabenfall noch 10 addieren. Denn sonst liefern '0' und 
'A' das gleiche Ergebnis.
1
    zahl = (character|0x20) - 'a' + 10;
#3600881
Lesenswert?

Ich würde einige Standardfunktionen aus ctype.h verwenden, ist meiner 
Meinung nach übersichtlicher. Zusätzlich würde ich die Funktion gegen 
falsche Übergabewerte absichern. Sowas in der Art (ungetestet):
1
int_fast8_t HexCharToInt(char ch){
2
  int_fast8_t Result = -1;
3

4
  if(isxdigit(ch)){
5
    if(isdigit(ch){
6
      Result = ch - '0';
7
    }
8
    else{
9
      Result = tolower(ch) - 'a' + 10;
10
    }
11
  }
12

13
  return Result;
14
}

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