#1 19. Dezember 2010 ASCII -> HEX Hallo, undzwar liegt folgendes Problem in C vor: Ich möchte gerne ein einzelnes ASCII-Zeichen, z.B. "A" zunächst in seinen Hex-Wert konvertieren, also "41", wobei ich den linken und den rechten Teil seperat "ansprechen" möchte. ASCII-"A" -> HEX ("A")="41" -> HEX ("A")[0] = 4 , HEX ("A")[1] = 1 Also dass diese Hexzahlen einzeln abrufbar sind. Ich bin mittlerweile am verzweifeln. Notfalls greife ich auf Inline-Assembly zurück... + Multi-Zitat Zitieren
#2 19. Dezember 2010 AW: ASCII -> HEX int zu hex: Code: int i = 255; char str[10]; sprintf( str, "%x", i ); und da du dann eh nen char-array hast kannst auch auf alle stellen der hex-zahl zugreifen. + Multi-Zitat Zitieren
#3 19. Dezember 2010 AW: ASCII -> HEX Danke für die flotte Antwort. Wie verwende ich atoi richtig? : Code: char ascii[] = "A"; char hex[2]; sprintf(hex,"%2x",ascii); printf("%d\n",hex[0]); printf("%d\n",hex[1]); sodass ich den integerwert 4 in hex[0] und den integerwert 1 in hex[1] habe um dein Beispiel zu nutzen muss ich wohl bei atoi verwenden, aber bei mir kommt nur murks raus. //EDIT: Werde es wohl jetzt durch: SHR AL,4 und AND AL,0F lösen trotzdem danke! + Multi-Zitat Zitieren
#4 19. Dezember 2010 AW: ASCII -> HEX mit atoi generierst du eine zahl aus einem char-array. du brauchst aber doch lediglich die integer-werte der einzellnen chars oder? falls ja, die kannst du einfach zu integer casten. Code: char str[2] = "ab"; int a = (int) str[0]; int b = (int) str[1]; was in deinem fall aber auch murks wäre. Code: #include <stdio.h> #include <stdlib.h> int main() { char ascii[] = "A"; char hex[2]; sprintf(hex, "%x", ascii[0]); printf("%c\n", hex[0]); printf("%c\n", hex[1]); return 0; }; du hast btw nicht die integer werte in dem array, sondern die hex-chars 0-9 A-F, also keine nummern %d, sondern chars %c. wenn du diese werte dann in nummern umwandeln willst, musst dir selber was basteln. Code: int hxctoi(const char c) { switch(c) { case '0': return 0; case '1': return 1; case '2': return 2; [...] case 'a': case 'A': return 10; case 'b': case 'B': return 11; case 'c': case 'C': return 12; [...] } } + Multi-Zitat Zitieren
#5 19. Dezember 2010 AW: ASCII -> HEX oh lol habe das casten ja völlig vergessen -.- Habe es nun folgendermaßen gelöst: Code: int asciihexl(char * ascii) { __asm("MOV 8(%EBP),%EAX"); __asm("MOV (%EAX),%EAX"); __asm("AND $0x000000FF,%EAX"); __asm("SHR $4,%AL"); } int asciihexr(char * ascii) { __asm("MOV 8(%EBP),%EAX"); __asm("MOV (%EAX),%EAX"); __asm("AND $0x0000000F,%EAX"); } ... Code: char ascii[] = "A"; int hexl = asciihexl(ascii); int hexr = asciihexr(ascii); printf("%d\n",hexl); printf("%d\n",hexr); + Multi-Zitat Zitieren
#6 19. Dezember 2010 AW: ASCII -> HEX Gibts einen bestimmten Grund, warum du auf ASM umsteigst? C hat native Bitwise-Operations: shift: << >> and: & or: | MfG SpyCrack + Multi-Zitat Zitieren
#7 19. Dezember 2010 AW: ASCII -> HEX Hätte ich auch verwenden können, hatte jedoch zunächst Probleme damit die Bitoperationen auf das Ascii zeichen anzuwenden (De-/Referenzierung) und bin dann kurzerhand auf Inline-Assembly umgestiegen, da ich mich da etwas sicherer fühle bzgl. Pointer und Co. + Multi-Zitat Zitieren
#8 19. Dezember 2010 AW: ASCII -> HEX Du wirfst hier mit Inline Assembly um dich, aber ich glaube in Wirklichkeit hast du keine Ahnung was Hexadezimalsystem und normales Dezimalsystem überhaupt ist. Einfach mal in Wiki ein bisschen lesen und diese Tabelle anschauen ASCII-Tabelle hilft vielleicht. Vielleicht hilft dir auch dieses Beispiel: Code: char test[] = "J"; printf("%d %X, %d %X, %d %X \n",test[0],test[0], ((test[0] >> 4) & 0xF), ((test[0] >> 4) & 0xF),(test[0] & 0xF) ,(test[0] & 0xF)); + Multi-Zitat Zitieren
#9 19. Dezember 2010 AW: ASCII -> HEX Ehm ja. Doch ich weiß schon was das Hexadezimalsystem und das Dezimalsystem ist, und den Assembly-Code habe ich ja auch nicht vom Himmel geholt, zumal ja jetzt alles wie gewünscht funktioniert. Danke fürs Beispiel, jetzt gehts auch mit den nativen Bitwiseoperationen aus C: ((test[0] >> 4) & 0xF) (test[0] & 0xF) + Multi-Zitat Zitieren