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?
Thx ngc5907! Oliver S. schrieb: > ... Und einem scharfen Blick in die ASCII-Tabelle... Ja ich weiß hab mich verlesen natürlich ist F 46.......
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
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
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...
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?
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
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
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'; |
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; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.