Formatierung Hexadezimal



  • Hallo,
    habe mir eine Schleife gebastelt, welche einen String Zeichen für Zeichen Hexadezimal umwandelt:

    //String (ID) Zeichen für Zeichen zerpflücken und in Hex wandeln
    	  for(int i=0; i < id.length(); i++)
    	  {
          string val=resultingScope.substr(pos,1);            //Position der Zahl im String "ID"
    
          id_hex[i]=sprintf(buffer,"%16X",*val.c_str());      //hier die eigentliche Umwandlung in Hex und im array speichern
    
          Hexwert=buffer;
    
          Hexwert_Ans = Hexwert.c_str();                      //Umwandlung in Ansi für Ausgabe
    
          //ListBox2->Items->Add(id_hex[i]);
    
          ListBox2->Items->Add(Hexwert_Ans);      
    
          pos=pos+1;                                           //nächstes Zeichen im string
    	  }
    

    Funktioniert auch, nur ich brauche die Werte in der Form z.B. 0x31. Und bei meiner Schleife kommt nur 31 raus. Wie muss ich das machen?

    Vielen Dank schonmal.



  • bei sprintf ein 0x mit ausgeben?



  • Danke, Scheint zu funktionieren, jetzt zeigt es mir die Zahlen mit 0x davor in der ListBox an aber warum ist zwischen dem 0x und der Zahl ein Riesen-Leerzeichen?

    Habs jetzt so geschrieben:

    id_hex[i]=sprintf(buffer,"0x%16X",*val.c_str());
    


  • Weißt du denn, was du mit "0x%16X" angegeben hast?
    Wen du führende Nullen haben willst, dann zusätzlich eine 0 angeben, also

    "0x%016X"
    


  • Th69 schrieb:

    Weißt du denn, was du mit "0x%16X" angegeben hast?
    Wen du führende Nullen haben willst, dann zusätzlich eine 0 angeben, also

    "0x%016X"
    

    Nicht so wirklich, hab mir das auch nur aus dem Netz rausgesucht. Hab von der ganzen Formatierung leider nicht viel Ahnung und mache das zum ersten Mal. Wenn ich es so schreibe wie du es gepostet hast, dann hab ich aber viele Nullen nach dem x. Ich brauche es wie gesagt in folgender Form:

    char 1 -> Hex 0x31



  • Da steht ja auch 16X, also mit 16 digits.
    nimm mal "%#02X"



  • Danke, genau das was ich brauch. Ich glaub jetzt hab ichs auch verstanden wie es funktioniert 🙂



  • Am besten nimmst du gar kein sprintf , das is üble C/C++ Frickelei, viel zu kompliziert. Was genau soll das denn werden?
    Hier der Quelltext, um jede Ziffer eines Strings in eine 6-stellige Hexadezimalzahl umzuwandeln, das sollte dir den richtigen Hinweis geben, wie man das in C++/VCL macht.

    #include <System.hpp>    // für AnsiString
    #include <SysUtils.hpp>  // für IntToHex
    #include <cctype>        // für std::isdigit
    
    for( int i = 1; i <= Text.Length; ++i )
    {
       if( std::isdigit( Text[i] ) )
       {
          AnsiString Hex = "0x" + IntToHex( Text[i] - '0', 6 ); 
       }
    }
    


  • Es geht einfach darum eine ID zu verschlüsseln und diese Verschlüsselungsfunktion brauch die ID im Hexadezimal-Format.



  • xXMartinoXx schrieb:

    Es geht einfach darum eine ID zu verschlüsseln und diese Verschlüsselungsfunktion brauch die ID im Hexadezimal-Format.

    Zeig mal diese Funktion. Ich vermute, du irrst dich.



  • unsigned char data[] = 
    {
        0x74, 0x65, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72,       
        0x69, 0x6e, 0x67, 0x20, 0x31, 0x32, 0x33, 0x34
    };
    

    Das wird in einem Beispiel an die Verschlüsselungsfunktion übergeben. Ist doch Hexadezimal oder nicht? Und ich möchte die Funktion nutzen und muss mir deshalb eben solch ein array aufbauen.



  • xXMartinoXx schrieb:

    Ist doch Hexadezimal oder nicht?

    Ist es. Allerdings in deinem Quellcode. Daraus baut der Compiler Binärdaten.

    xXMartinoXx schrieb:

    Und ich möchte eben die Funktion nutzen und muss mir deshalb eben solch ein array aufbauen.

    Nein, musst du nicht.



  • MFK schrieb:

    xXMartinoXx schrieb:

    Ist doch Hexadezimal oder nicht?

    Ist es. Allerdings in deinem Quellcode. Daraus baut der Compiler Binärdaten.

    xXMartinoXx schrieb:

    Und ich möchte eben die Funktion nutzen und muss mir deshalb eben solch ein array aufbauen.

    Nein, musst du nicht.

    Ist mir schon aufgefallen beim Debuggen. Da steht dann ein string in "data". Wenn nicht so, wie denn dann?



  • xXMartinoXx schrieb:

    Wenn nicht so, wie denn dann?

    Als Byte-Array.



  • OK...

    Und wie deklariert man sowas?

    unsigned char array[SIZE];
    

    Wäre das eins? So hab ich das nämlich versucht.

    Und meine Zahlen müsste ich dann in ASCII-Form dort rein schieben? Hab ich das richtig verstanden?



  • In deinem String liegen die Daten ja schon binär vor, vermutlich musst du da gar nichts kopieren. Wie sieht denn deine Verschlüsselungsfunktion aus? Kannst du der einen Zeiger auf einen Speicherbereich und Länge übergeben?



  • DocShoe schrieb:

    In deinem String liegen die Daten ja schon binär vor, vermutlich musst du da gar nichts kopieren. Wie sieht denn deine Verschlüsselungsfunktion aus? Kannst du der einen Zeiger auf einen Speicherbereich und Länge übergeben?

    Ja, hatte da was missverstanden. Hab es mitlerweile gelöst. Und richtig, man muss der Funktion diese beiden Sachen mitgeben. Hab blos jetzt meinen code nicht zur Hand. Kann ich demnächst mal noch posten wenns interessiert.


Anmelden zum Antworten