Hallo Vermutlich ist es peinlich aber ich kann die Lösung nicht finden: Ich habe einen String (char-Array) mit einem Hex-Wert, den will ich in einer INT-Variablen speichern
sscanf (unelegant, da die ganze scanf/prinft-Library gelinkt werden muss) strtol sollte in stdlib.h enthalten sein: long strtol(const char *nptr, char **endptr, int base); Dank des "base"-Arguments kann man die zu verwendende Radix angeben, hier also 16. Beipspiel: char *string, *stopstring; long l; string = "feedcode"; l = strtol(string, &stopstring, 16); printf("string = %s\n", string); printf(" strtol = %ld\n", l); Ob man auf das stopstring-Argument verzichten kann, ist mir jetzt nicht ganz klar; in diesem Pointer wird jedenfalls ein Pointer auf den auf die ausgewertete Zahl folgenden String geliefert. Bei obigem Beispiel müsste der demnach auf die terminierende Null der Stringkonstanten verweisen. Sinn vonn't janze ist beispielweise sowas: char *string, *stopstring; long l1, l2; string = "feedcode deadface"; l1 = strtol(string, &stopstring, 16); printf("string = %s\n", string); printf(" strtol = %ld\n", l1); string = stopstring; l2 = strtol(string, &stopstring, 16); printf(" strtol = %ld\n", l2);
Danke, ich wußte, doch, daß es a) was einfaches ist und ich b) das auch schon mal gesehen hatte. Kopp wie Sieb
Auf stopstring kann man verzichten, allerdings kann man sich dann nicht mehr sicher sein, ob die Konvertierung wirklich OK war oder eine reale 0 geparst worden ist.
Hallo, ich greife mal diesen Thread auf, da er GENAU mein Problem beschreibt. Hab mich schon wund gesucht, die letzten 2 Tage. Und alle Lösungen, die ich gefunden habe funktionieren leider nicht, so auch diese: Beispiel: uint8_t stringLength = 0; uint8_t StrBuf[50]; long test = 99; // ascii dezimal c stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test); uart_put(USART_CHANNEL1, StrBuf, stringLength); ^^ Hiermit wird schön: "Test: 63" (also ascii hex von c) ausgegeben. Nun will ich c als char in das ascii hex umwandeln und ausgeben. Beispiel 2: uint8_t stringLength = 0; uint8_t StrBuf[50]; char test[] = "c"; stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test); uart_put(USART_CHANNEL1, StrBuf, stringLength); ^^funktioniert nicht Beispiel 3: uint8_t stringLength = 0; uint8_t StrBuf[50]; char* teststring; teststring = "c"; long test; test = strtol(teststring, NULL, 16); stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test); uart_put(USART_CHANNEL1, StrBuf, stringLength); ^^funktioniert ebenfalls nicht und auch noch zig Variationen mit z.B. atoi gehen nicht. Hoffe mir kann jemand helfen.
Ich Programmiere mir das immer selber, ist irgendwie kleiner als alles andere was in der libc drin ist:
1 | int hexatoi(char *in){ |
2 | int value=0; |
3 | unsigned char i=0; |
4 | while(1){ |
5 | if(in[i] >= '0' && in[i] <= '9'){ |
6 | value <<= 4; |
7 | value |= in[i] - '0'; |
8 | }
|
9 | else if(in[i] >= 'A' && in[i] <= 'F'){ |
10 | value <<= 4; |
11 | value |= in[i] - 'A'+10; |
12 | }
|
13 | else if(in[i] >= 'a' && in[i] <= 'f'){ |
14 | value <<= 4; |
15 | value |= in[i] - 'a'+10; |
16 | }
|
17 | else
|
18 | break; |
19 | i++; |
20 | }
|
21 | return value; |
22 | }
|
was willst du denn eigentlich überhaupt machen? Beipisl 2 ist sicher daneben da du ja wohl nicht die adresse des Strings ausgeben willst Beispiel 3 müsste c (dezimal 12) als wert ausgeben
@Timmo H. habe es mit deiner Funktion versucht, leider kommt dabei auch nur eine 0 oder ein c heraus. @Walter Was ich machen will, habe ich unter Beispiel 1 geschrieben. Und für den long hab ich eben das X genommen, da ich ja den ascci-hex wert ausgeben will. Nochmal: Ich will einfach den ascii-hex Wert eines char ausgeben. In diesem Fall c >> 63 gruß
@Mem Dann hast du was falsch gemacht. Denn wenn ich folgenden Code Kompiliere gibt er "AFFEDEAD" aus:
1 | int hexatoi(char *in){ |
2 | int value=0; |
3 | unsigned char i=0; |
4 | while(1){ |
5 | if(in[i] >= '0' && in[i] <= '9'){ |
6 | value <<= 4; |
7 | value |= in[i] - '0'; |
8 | }
|
9 | else if(in[i] >= 'A' && in[i] <= 'F'){ |
10 | value <<= 4; |
11 | value |= in[i] - 'A'+10; |
12 | }
|
13 | else if(in[i] >= 'a' && in[i] <= 'f'){ |
14 | value <<= 4; |
15 | value |= in[i] - 'a'+10; |
16 | }
|
17 | else
|
18 | break; |
19 | i++; |
20 | }
|
21 | return value; |
22 | }
|
23 | |
24 | |
25 | int main(){ |
26 | int wert; |
27 | char test[] = "AFFEDEAD"; |
28 | wert = hexatoi(test); |
29 | printf("%X",wert); |
30 | }
|
Wenn du das mit "0x..." übergibst, musst du halt den Pointer inkrementieren:
1 | int main(){ |
2 | int wert; |
3 | char test[] = "0xAFFEDEAD"; |
4 | if(test[1] == 'x') |
5 | wert = hexatoi(test+2); |
6 | else
|
7 | wert = hexatoi(test); |
8 | printf("%X",wert); |
9 | }
|
dann musst du schreiben: teststring = "c"; test = *teststring; stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test); Grüße Walter
Womit dann gleich wieder ganze Printf-Lib dazugrlinkt wird. Unnützer Ballast, wenn man die Funktionen ansonsten nicht braucht.
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.