String in Byte-Array umwandeln...



  • Hallo zusammen,

    ich hätte folgende Frage:

    Ich möchte ein kleines Programm in C realisieren, wo man dem Programm einen MD5-Hash übergibt.
    Also z.B. argv[1] = 098f6bcd4621d373cade4e832627b4f6 (entspricht 'test').

    Nun möchte ich o.g. String in ein Byte-Array umwandeln. Damit es folgendermaßen aussieht bzw. sich so verhält:

    char ByteArray[] = { 
                         0x09, 0x8f, 0x6b, 0xcd,
                         0x46, 0x21, 0xd3, 0x73,
                         0xca, 0xde, 0x4e, 0x83,
                         0x26, 0x27, 0xb4, 0xf6
                       };
    

    Wie bekommt man das in C hin? Könntet Ihr mir ein paar Tipps geben bzw. ein kleines Code-Beispiel?
    Vielen Dank.

    Grüße
    DaveX


  • Mod

    Etwas in der Richtung von:

    for (i = 0; i < strlen[eingabe] / 2; ++i)
      sscanf(eingabe + 2* i, "%2x", &ausgabe[i])
    

    Natürlich mit den üblichen Verbesserungen: Prüfen, ob überhaupt eine gerade Anzahl Zeichen vorliegt; kein strlen in der for-Bedingung; oder Ausbesserung eventueller Flüchtigkeitsfehler. All dies sei dem geneigten Leser überlassen.



  • Super!!! 🙂 Vielen Dank. Hat funktioniert.
    Habe deinen Code folgendermaßen umgesetzt für meinen Zweck und es hat auf Anhieb funktioniert:

    for( i = 0; i < strlen( argv[1] ) / 2; i++ )
         sscanf( argv[1] + 2 * i, "%02x", &ByteHex[i] );
    

    Echt sehr nett von dir. Dankeschön. 😉

    Grüße
    DaveX


  • Mod

    Mach bitte noch das strlen aus der for-Bedingung raus, wie es sich gehört. Hier ist es zwar praktisch irrelevant, aber wir schreiben immer guten Code, selbst wenn es nur einen theoretischen Unterschied macht. (Erklärung: strlen ist O(N) in der Länge N der Zeichenkette. Bei jedem Aufruf. Daher Aufruf auslagern!)



  • SeppJ schrieb:

    Mach bitte noch das strlen aus der for-Bedingung raus, wie es sich gehört.

    Sollte das nicht eigentlich der Compiler können ? 😕
    Weil der string kann ja in der Schleife nicht verändert werden da sscanf einen "const char*" annimmt.


  • Mod

    DarkShadow44 schrieb:

    SeppJ schrieb:

    Mach bitte noch das strlen aus der for-Bedingung raus, wie es sich gehört.

    Sollte das nicht eigentlich der Compiler können ? 😕

    Möglicherweise ja, möglicherweise nein. Ich weiß, viele Compiler können es. Aber wenn sie es mal nicht packen, ist hier der Preis sehr hoch, da nicht bloß irgendwas ein bisschen langsamer ist, sonder wir gleich in einer ganz anderen Komplexitätsklasse landen.



  • Wieso strlen aus der for-Bedingung rausnehmen? Ist das so falsch?
    Wie sollte es denn ohne strlen genau aussehen? Könntet Ihr mir da ein Beispiel
    posten?



  • So habe mich jetzt registriert. 🙂

    for( i = 0; i < strlen( argv[1] ) / 2; i++ )
        sscanf( argv[1] + 2 * i, "%02x", ( unsigned int * ) &ByteHex[i] );
    

    Also wäre das so nicht ganz korrekt?



  • int len = strlen(argv[1]);
    for( i = 0; i < len / 2; i++ )
        sscanf( argv[1] + 2 * i, "%02x", ( unsigned int * ) &ByteHex[i] );
    

    Wenn strlen in der Bedingung steht, wird bei jedem Aufruf die Laenge des Strings bestimmt, so wird es einmal bestimmt und dann zwischengespeichert und zwar unabhaengig von den Compileroptimierern.



  • Ah okay. Stimmt. Dankeschön. 😉


Log in to reply