[C/C++] ASCII -> HEX

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Golly, 19. Dezember 2010 .

Schlagworte:
  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...
     
  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.
     
  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!
     
  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;
     
     [...]
     }
    } 
     
  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);
    
     
  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
     
  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.
     
  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));
    
     
  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)
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.