HEX CONVERTER



  • du könntest immer zwei zeichen einlesen und dann "wert = 16*(zeichen1-'0') + zeichen2-'0'" oder so ähnlich



  • Wie kann man disen code den ich aus einer datei auslese, in ASCII Code umwandeln :

    214601360121470136007EFE09D21901
    2146017EB7C20001FF5F160021480119
    00FF
    194E79234623965778239EDA3F01B2CA
    3F0156702B5E712B722B732146013421



  • C_Anfaenger80 schrieb:

    Wie kann man disen code den ich aus einer datei auslese, in ASCII Code umwandeln :

    214601360121470136007EFE09D21901
    2146017EB7C20001FF5F160021480119
    00FF
    194E79234623965778239EDA3F01B2CA
    3F0156702B5E712B722B732146013421

    So z.B.?

    unsigned char *hex = "214601360121470136007EFE09D21901";
    unsigned char *cp = hex;
    unsigned char ascii[100];
    unsigned char *ap = ascii;
    while(*cp)
    {
       *ap = 0;
       switch(*cp)
       {
       case '0': *ap = 0; break;
       case '1': *ap = 16; break;
       case '2': *ap = 32; break;
    ... usw. ...
       case '9': *ap = 144; break;
       case 'A': *ap = 160; break;
       case 'B': *ap = 176; break;
    ... usw. ...
       case 'F': *ap = 240; break;
       default: *ap = 0; break; /* Non-HEX-Zeichen! */
       }
       cp++;
       switch(*cp)
       {
       case '0': *ap += 0; break;
       case '1': *ap += 1; break;
       case '2': *ap += 2; break;
    ... usw. ...
       case '9': *ap += 9; break;
       case 'A': *ap += 10; break;
       case 'B': *ap += 11; break;
    ... usw. ...
       case 'F': *ap += 15; break;
       default: *ap = 0; break; /* Non-HEX-Zeichen! */
       }
       cp++;
       ap++;
    }
    *ap = 0;
    


  • Miq schrieb:

    C_Anfaenger80 schrieb:

    Wie kann man disen code den ich aus einer datei auslese, in ASCII Code umwandeln :

    214601360121470136007EFE09D21901
    2146017EB7C20001FF5F160021480119
    00FF
    194E79234623965778239EDA3F01B2CA
    3F0156702B5E712B722B732146013421

    So z.B.?

    unsigned char *hex = "214601360121470136007EFE09D21901";
    unsigned char *cp = hex;
    unsigned char ascii[100];
    unsigned char *ap = ascii;
    while(*cp)
    {
       *ap = 0;
       switch(*cp)
       {
       case '0': *ap = 0; break;
       case '1': *ap = 16; break;
       case '2': *ap = 32; break;
    ... usw. ...
       case '9': *ap = 144; break;
       case 'A': *ap = 160; break;
       case 'B': *ap = 176; break;
    ... usw. ...
       case 'F': *ap = 240; break;
       default: *ap = 0; break; /* Non-HEX-Zeichen! */
       }
       cp++;
       switch(*cp)
       {
       case '0': *ap += 0; break;
       case '1': *ap += 1; break;
       case '2': *ap += 2; break;
    ... usw. ...
       case '9': *ap += 9; break;
       case 'A': *ap += 10; break;
       case 'B': *ap += 11; break;
    ... usw. ...
       case 'F': *ap += 15; break;
       default: *ap = 0; break; /* Non-HEX-Zeichen! */
       }
       cp++;
       ap++;
    }
    *ap = 0;
    

    WTF??? 😮 Oh, shit!



  • Wie kann man auf den Ganzen Text zugreifen,und nicht ZEILENWEISE zum beispiel aus einer Datei ?



  • David_pb schrieb:

    Miq schrieb:

    ...

    WTF??? 😮 Oh, shit!

    Was soll mir das sagen? Dass es auch kürzer/eleganter/schneller geht? Klar, nur hilft das C_Anfaenger80? Soll er doch selber lernen, oder?



  • Hi!

    Das soll, bei aller Freundlichkeit, sagen das ich irgendwie einen leichten Magenkrampf bekommen habe bei dem Code...

    Dass das noch zu optimieren ist müsstest du auch selbst sehen! 🙂

    grüße



  • Willst Du ihm gleich so was wie

    *ap++=((*cp>'@'?*cp-'A':*cp-'0')<<4)|(*++cp>'@'?*cp-'A':*cp-'0');++cp;
    

    vorsetzen, oder wie? 😃

    Die Optimierung kriegt er später selbst, erstmal muss er das Grundprinzip verstehen.



  • hi,
    hier mal eine bisserl kürzere Variante, die auch nem Anfänger vorgesetzt werden kann, denk ich ... 😉

    #include <stdio.h>
    
    int main() {
    	char *hex = "214601360121470136007EFE09D21901";
    	char tmp[3] = {0, 0, '\0'};
    	char *ptr = hex;
    	int value;
    
    	while (*ptr) {
    		tmp[0] = *ptr++;
    		tmp[1] = *ptr++;
    		/* sscanf( tmp, "%X%X", &value ); <= ein %X reicht! thx@net */
    		sscanf( tmp, "%X", &value );
    		printf( "%d\n", value );
    	}
    	return 0;
    }
    

    Vorsicht: Das Durchlaufen des Strings geht hier von ner geraden Anzahl von Zeichen aus!

    grüße



  • Sepp Brannigan schrieb:

    sscanf( tmp, "%X%X", &value );

    zweimal %x ?



  • net schrieb:

    Sepp Brannigan schrieb:

    sscanf( tmp, "%X%X", &value );

    zweimal %x ?

    oops, gut aufgemerkt - eins reicht natürlich! Aufgrund der Toleranz von scanf ist mir der Fehler nicht aufgefallen. 🙄



  • Sepp Brannigan schrieb:

    Aufgrund der Toleranz von scanf ist mir der Fehler nicht aufgefallen.

    zufall. scanf hat sich als 2ten parameter was vom stack geholt, das es nicht als hexwert darstellen konnte. harmlos in den meisten fällen....



  • net schrieb:

    Sepp Brannigan schrieb:

    Aufgrund der Toleranz von scanf ist mir der Fehler nicht aufgefallen.

    zufall. scanf hat sich als 2ten parameter was vom stack geholt, das es nicht als hexwert darstellen konnte. harmlos in den meisten fällen....

    Gute Frage, was da scanf genau macht - tmp ist ja nach dem ersten hex-wert terminiert - da gibts also nix mehr. Was aber bei Bedarf vom Stack geholt wird, sollte doch in dem Fall die Zieladresse für den zweiten Wert sein, oder? (aufgr. variabler Parameterliste) und das könnte dann schon evtl. schon Probleme geben ...
    Hab das Ganze mal ein bisschen ausgebaut um nen Fehler zu provozieren ...

    ...
    char tmp[] = {0, 0, ' ', 0, 0, ' ', 0, 0, ' ', 0, 0, '\0'};
    ...
    	tmp[0] = *ptr++;
    ...
    	tmp[10] = *ptr++;
    	sscanf( tmp, "%X %X %X %X", &value );
    ...
    

    ergibt: "Bus error (core dumped)" - Zitat ende
    Quad erat expectare - oder so ähnlich (Lateinkenner vor ;))



  • Danke an eurer HILFE, nur noch eine Frage, ich habe versucht den **die Text Datei anzeigen, damiter aus Sie lesen kann. Aber wenn ich das mache gibt er mir nur NULLEN am Bildschirm zurueck..
    Ich habe mit fopen versucht aber es ging nicht. Mit diesen Programm liest er den ganzen text aus einer Datei ein, aber er wandelt nur die eingegebene Zeile(weil ich nicht geschaft habe den ganzen texe einzulesen). Wie kann man den Ganzen Text einlesen ?

    #include <stdio.h>
    #include <string.h>

    int main( )
    {

    int a;

    [b]char hex = "2143E2312FFE21006700432";
    char tmp[3] = {0, 0, '\0'};
    char ptr = hex;
    int value;

    printf("1: Binaer Ausgabe\n");

    printf("2: ASCII Ausgabe\n");
    scanf("%d",&a);

    // Parameter 1 des Aufrufs ist die Quelldatei

    FILE *pFile = fopen( "hex.txt", "r" ); //Einlesen der Text Datei

    if (pFile == NULL) perror ("Error opening file");

    //Zählvariable i für die Ausgabe

    int i ;

    char inhalt[1024];

    switch(a)
    {
    case 1:

    while( fgets(inhalt, 1024, pFile) != NULL )
    {
    for ( i = 9; i <= (strlen(inhalt) - 4); i++)

    {
    printf("%c", inhalt[i]);
    }

    printf("\n",inhalt[i]);

    }
    fclose( pFile );

    break;

    case 2:

    while (*ptr)
    {
    tmp[0] = *ptr++;
    tmp[1] = *ptr++;
    sscanf( tmp, "%X ", &value );
    printf( "%d\n ", value );
    }
    break;

    }
    return 0;
    }



  • Erstmal schönen:

    #include <stdio.h>
    #include <string.h>
    
    int main( )
    {
       int a;
       char *hex = "2143E2312FFE21006700432";
    

    Bist Du sicher, dass Du das brauchst? Du liest doch aus einer Datei.

    char tmp[3] = {0, 0, 0};
       char *ptr = hex;
       int value;
    
       printf("1: Binaer Ausgabe\n");
       printf("2: ASCII Ausgabe\n");
       scanf("%d",&a);
    
    // Parameter 1 des Aufrufs ist die Quelldatei
    

    Das ist ein C++-Kommentar...

    FILE *pFile = fopen( "hex.txt", "r" ); //Einlesen der Text Datei
       if (pFile == NULL) perror ("Error opening file");
    
    //Zählvariable i für die Ausgabe
       int i;
       char inhalt[1024];
    
       switch(a)
       {
       case 1:
          while( fgets(inhalt, 1024, pFile) != NULL )
    

    Wenn die Zeilen länger als 1024 Zeichen sind, ist inhalt eventuell nicht 0-terminiert, und das strlen unten geht schief.

    {
             for ( i = 9; i <= (strlen(inhalt) - 4); i++)
             {
                printf("%c", inhalt[i]);
             }
             printf("\n",inhalt[i]);
    

    Was soll hier das "inhalt[i]" nochmal? Copy-und-Paste-Problem, denke ich 😉

    }
          fclose( pFile );
    

    Du schließt die Datei nur, wenn der Benutzer eine 1 eingegeben hat. Nicht tödlich, aber unsauber.

    break;
       case 2:
          while (*ptr)
          {
             tmp[0] = *ptr++;
             tmp[1] = *ptr++;
             sscanf( tmp, "%X ", &value );
             printf( "%d\n ", value );
          }
    

    Im Prinzip ja nicht schlecht, nur gibst Du hier den Inhalt von hex aus, nicht den Deiner Datei. Willst Du das???

    break;
       }
       return 0;
    }
    


  • In der Text Datei befindet sich ein HEX Text. Diesen Text will ich in ASCII Code und in Binaer Code umwandeln, aber der Problem ist das ich nicht den Ganzen Text umwandele, sonder nur den gegbenen "text".
    Wie kann ich auf den Ganzen Text zugreifen ? "(hex.txt)", damit ich die Ganze Text Datei umwandeln kann?



  • C_Anfaenger80 schrieb:

    In der Text Datei befindet sich ein HEX Text. Diesen Text will ich in ASCII Code und in Binaer Code umwandeln, aber der Problem ist das ich nicht den Ganzen Text umwandele, sonder nur den gegbenen "text".
    Wie kann ich auf den Ganzen Text zugreifen ? "(hex.txt)", damit ich die Ganze Text Datei umwandeln kann?

    Vorab: Dein Programm werde ich nicht für Dich schreiben, das musst Du schon selbst machen... 😉
    Du müsstest das, was Du nach Eingabe einer 1 machst, mit dem kombinieren, was nach Eingabe einer 2 passiert. Wenn Du die Schleife zum Lesen der einzelnen Zeilen aus der Datei statt in den "case 1" außen um den switch legst, bist Du schon ein ganzes Stück weiter. Und dann solltest Du im "case 2" ptr auf die richtigen Daten zeigen lassen - den "char *hex" schmeiss' mal 'raus!



  • Danke für den Tip. Ich habe den Programm so bis jetzt fast fertig, mir fehlt nur noch die umwandlung in Binär Code, den Ascii umwandlung habe ich schon. Fals jemand einen guten Tip hat, Bitte sagen.
    Mfg,
    Elvin


Anmelden zum Antworten