Char zu Hex konvertieren



  • Der Titel lässt vielleicht vermuten, dass es sich um ein einfaches Problem handelt, aber ich wusste genau wie ich es nennen sollte.
    Ich habe auch bei Google keine Lösung für mein Problem gefunden. 😕

    Mein Problem ist folgendes:

    Ich möchte eine Art Packet Editor für ein Spiel machen, bei dem der User selber festlegen kann, welche Pakete er versenden will.

    Nun habe ich beispielweise folgende Eingabe:

    "0300096C6F6C"
    

    und möchte, dass es in das hier konvertiert wird:

    BYTE packet[] = {0x03, 0x00, 0x09, 0x6C, 0x6F, 0x6C};
    

    Wie kann ich das konvertieren? (Der String liegt als Typ char* vor.)

    Ich hoffe, mir kann jemand weiterhelfen.. 😉

    Regards



  • int dummy;
    while( 1==sscanf(chararray,"%02x",&dummy) )
      chararray+=2,*packet++=dummy&255;
    


  • Wutz schrieb:

    int dummy;
    while( 1==sscanf(chararray,"%02x",&dummy) )
      chararray+=2,*packet++=dummy&255;
    

    Der Code läuft bei mir nicht wirklich.
    Wie müssen chararray und packet denn deklariert werden?



  • Mann Mann, bist du Anfänger?
    Da bekommt ihr hier schon fertig Lösungen und könnt diese noch nicht mal aufrufen.

    char *chararray="0300096C6F6C";
    unsigned char p[ausreichendgross],*packet=p;
    

    <ausreichendgross> bestimmst du jetzt aber bitte mal selbst.



  • OoicyoO schrieb:

    Der Code läuft bei mir nicht wirklich.

    Mit Vorsicht geniessen, sonst gewöhnst du dir schlechten Stil an, der sich in C gerne mit bösen Portabilitätsproblemen rächt. Versuchs mal so:

    #include <stdio.h>
    
    int main(void)
    {
       char *chararray = "5775747a";  /* Eingabe */
       char data[5] = {0};            /* Speicherbereich für das packet */
       char *packet = data;           /* Zeiger auf den Bereich den man erhoehen kann */
       unsigned dummy;                /* die Formatangabe unten verlangt unsigned statt int */
    
       for (; 1 == sscanf(chararray, "%02x", &dummy); packet++)
       {
          chararray += 2;
          *packet = dummy;
       }
    
       printf(data);
       printf(" kann auch nicht alles wissen\n");
    }
    

    🙂

    Nachtrag:
    Wahrscheinlich wäre es noch klarer, wenn man das chararray += 2; noch nach das packet++ packt, dann hat man auf einen Blick die beiden Erhöhungen nach jedem Schleifendurchlauf. Das ist der Grund, warum es die for-Syntax für Schleifen gibt.



  • Wutz schrieb:

    Mann Mann, bist du Anfänger?
    Da bekommt ihr hier schon fertig Lösungen und könnt diese noch nicht mal aufrufen.

    Und sowas am besten ignorieren, darauf einsteigen bringt gar nichts.
    🙂



  • Vielen Dank euch beiden!
    Es funktioniert bei beiden perfekt.

    btw. bin ich in manchen Fällen wirklich noch ein Anfänger. Sonst hätte ich ja die Frage erst gar nicht gestellt. :>



  • OoicyoO schrieb:

    Es funktioniert bei beiden perfekt.

    Allerdings ist das im ersten Fall nicht so einfach zu bestätigen. Formulierungen wie *packet++=dummy&255 müssten dich schon stutzig machen, weil das explizite Abschneiden auf die Breite 8 (durch das AND mit 255) offenbar unnötig ist. Wenn der Wert eines Typs zu breit für die Zuweisung an einen anderen Typ ist, wird er sowieso implizit abgeschnitten. Das verrät eine Unsicherheit im Typsystem.

    Die Frage, ob man sich darauf verlassen darf, dass ein Compiler einen positiven signed-Wert genauso kodiert wie einen gleichen unsigned-Wert ist schwieriger zu beantworten als die Frage nach dem Typ, den %x haben will. Mal sehen, ob Wutz eine Antwort findet.
    🙂


Anmelden zum Antworten