Forum: Compiler & IDEs char to hex to int


von Glenn R. (glenn_r)


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?

von Fred (Gast)


Lesenswert?

Wie wärs mit if?

von Oliver S. (oliverso)


Lesenswert?

... Und einem scharfen Blick in die ASCII-Tabelle...

Oliver

von NGC 5. (ngc5907)


Lesenswert?


von Glenn R. (glenn_r)


Lesenswert?

Thx ngc5907!



Oliver S. schrieb:
> ... Und einem scharfen Blick in die ASCII-Tabelle...

Ja ich weiß hab mich verlesen natürlich ist F 46.......

von Walter (Gast)


Lesenswert?

Glenn Rathke schrieb:
> 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

falsch, atoi wandelt eine ASCII STring in eine Zahl,
'F' '\0' wird also mitnichten in 41 (oder 46) gewandelt

von Oliver S. (oliverso)


Lesenswert?

Glenn Rathke schrieb:
> Ja ich weiß hab mich verlesen natürlich ist F 46.......

Das auch.

Durch mehrstündiges scharfes Nachdenken könntest du aber auch 
herausfinden, wie man nun vom ASCII-Wert 46 auf den gewünschten Wert 16 
kommt.

Oliver

von hexer (Gast)


Lesenswert?

Oliver S. schrieb:
> auf den gewünschten Wert 16
> kommt.

'F' ist 15 und nicht 16.

von nur so (Gast)


Lesenswert?

Wie waers mit:
1
int fn(int charValue){
2
 return x[i] - 'A';
3
}
dann bekommste fuer x = { 'A', 'B', ...}: fn('A') == 0, bzw fn(x[0]) == 
0...

von DirkB (Gast)


Lesenswert?

Glenn Rathke schrieb:
> 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.

Um welche Programmiersprache geht es denn dabei?

von Max H. (hartl192)


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

von Jürgen D. (poster)


Lesenswert?

Max H. schrieb:
> zahl=character-'A';   //oder zahl=character-'a'; wenn du mit
> Kleinbuchstaben arbeitest

Groß und Kleinbuchstaben unterscheiden sich nur durch ein Bit.
Mit 0x20 "verodern" und man hat immer Kleinbuchstaben

von Max H. (hartl192)


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';

von Karl H. (kbuchegg)


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;

von DirkB (Gast)


Lesenswert?

Max H. schrieb:
> DirkB schrieb:
>> Um welche Programmiersprache geht es denn dabei?
> Da der Thread im "GCC" Forum ist vermutlich C.

Dazu passt irgendwie nicht die Angabe des Arrays mit den [] (x = ['A', 
'B', 'C', '1', 'F', 'F']) und dass merkwürdige Verhalten von atoi.

von Max H. (hartl192)


Lesenswert?

Karl Heinz schrieb:
> Ich würde im Buchstabenfall noch 10 addieren.
Dummer Fehler :-(

von B. S. (bestucki)


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
}

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.