Zeichen in hex-Ansicht



  • Ich würde gerne einen hex-editor oder wenigstens einen hex-viewer schreiben.
    Da beim cast von char zu int nur ´ne dez-Zahl rauskommt wollte ich wissen ob´s eine Funktion zum dezimal->hex rechnen gibt. Oder muss ich die selbst schreiben?



  • Hi,

    ich habe selbst mal 2 funktionen dafür geschrieben:

    #include <string> 
    const char array[] = {'0', 
                          '1', 
                          '2', 
                          '3', 
                          '4', 
                          '5', 
                          '6', 
                          '7', 
                          '8', 
                          '9', 
                          'A', 
                          'B', 
                          'C', 
                          'D', 
                          'E', 
                          'F' 
                          }; 
    char *ULongTohex(unsigned long data) 
      { 
        unsigned long length = 0; 
    
        if(data < 0xFF                     ) length = 2; 
        else if(data < 0xFFFF     && length != 2) length = 4; 
        else if(data < 0xFFFFFF   && length != 4) length = 6; 
        else if(data < 0xFFFFFFFF && length != 6) length = 8; 
    
        unsigned int  reverse_counter = length; 
        unsigned int *counter        = new unsigned int[length]; 
        unsigned int  temp           = 0; 
    
        char *hex = new char [length+1]; 
    
        for (unsigned int i= 0; i < length; i++) 
          { 
            temp = data % 16; 
            data /= 16; 
            data-temp; 
            counter[i] = temp; 
          } 
        for(unsigned int i = 0; i< length ; i++) 
          { 
            hex[--reverse_counter] = (char)array[counter[i]]; 
          } 
        hex[length] = '\0'; 
        return hex; 
      } 
    
    unsigned long hexToULong(char *data) 
    { 
      unsigned hex_length = std::strlen(data); 
      unsigned long return_value = 0; 
      for(unsigned int i = 0; i < hex_length; i++) 
      { 
        for(unsigned char j = 0; j < 16; j++) 
        { 
          if(data[i] == array[j]) 
            { 
              return_value = ((return_value * 16) + j); 
            } 
        } 
      } 
      return return_value; 
    }
    

    Ich hoffe das dir das weiter hilft.

    MfG

    eViLiSSiMo



  • @eViLiSSiMo:
    du hast memory leaks.

    ich wuerde mir mal sprintf() ansehen, bzw. natuerlich auch stringstream



  • @ShadeOfMine:

    char *ULongTohex(unsigned long data) 
      { 
        unsigned long length = 0; 
    
        if(data < 0xFF                     ) length = 2; 
        else if(data < 0xFFFF     && length != 2) length = 4; 
        else if(data < 0xFFFFFF   && length != 4) length = 6; 
        else if(data < 0xFFFFFFFF && length != 6) length = 8; 
    
        unsigned int  reverse_counter = length; 
        unsigned int *counter        = new unsigned int[length]; // Muss gelöscht werden!
        unsigned int  temp           = 0; 
    
        char *hex = new char [length+1]; 
    
        for (unsigned int i= 0; i < length; i++) 
          { 
            temp = data % 16; 
            data /= 16; 
            data-temp; 
            counter[i] = temp; 
          } 
        for(unsigned int i = 0; i< length ; i++) 
          { 
            hex[--reverse_counter] = (char)array[counter[i]]; 
          } 
        hex[length] = '\0'; 
        delete counter; // counter löschen -> MemLeak 1
        return hex; 
      }
    

    Ok das eine hab ich gefunden aber wo sind die anderen *blind bin* 😞



  • eViLiSSiMo schrieb:

    Ok das eine hab ich gefunden aber wo sind die anderen *blind bin* 😞

    ersetze delte durch delete [] und es passt.

    Das 'muss gelöscht werden' finde ich nicht gut - besser der aufrufer stellt den speicher bereit - denn manchmal ist es besser den speicher auf den stack zu legen als per new anzufordern, vorallem wenn man weiss, wieviel man braucht.

    ausserdem kann man so ein delete[] recht leicht vergessen...

    kurz gesagt: ich mag es nicht, wenn der caller delete aufrufen muss.



  • Hi,

    Shade Of Mine schrieb:

    Das 'muss gelöscht werden' finde ich nicht gut - besser der aufrufer stellt den speicher bereit - denn manchmal ist es besser den speicher auf den stack zu legen als per new anzufordern, vorallem wenn man weiss, wieviel man braucht.

    ausserdem kann man so ein delete[] recht leicht vergessen...

    kurz gesagt: ich mag es nicht, wenn der caller delete aufrufen muss.

    dann ist das ja eine bessere Lösung sein oder?

    char *ULongTohex(unsigned long data) 
      { 
        unsigned long length = 0; 
    
        if(data < 0xFF                     ) length = 2; 
        else if(data < 0xFFFF     && length != 2) length = 4; 
        else if(data < 0xFFFFFF   && length != 4) length = 6; 
        else if(data < 0xFFFFFFFF && length != 6) length = 8; 
    
        unsigned int  reverse_counter = length; 
        unsigned int  counter[8]      = {0}; 
        unsigned int  temp            = 0; 
    
        char hex[9];
    
        for (unsigned int i= 0; i < length; i++) 
          { 
            temp = data % 16; 
            data /= 16; 
            data-temp; 
            counter[i] = temp; 
          } 
        for(unsigned int i = 0; i< length ; i++) 
          { 
            hex[--reverse_counter] = (char)array[counter[i]]; 
          } 
        hex[length] = '\0'; 
        return hex; 
      }
    


  • eViLiSSiMo schrieb:

    dann ist das ja eine bessere Lösung sein oder?

    Ne, das erzeugt undefiniertes verhalten: http://tutorial.schornboeck.net/referenz_return.htm

    folgendes würde mir besser gefallen:

    char *ULongTohex(unsigned long data, char* hex) 
      { 
        unsigned long length = 0; 
    
        if(data < 0xFF                     ) length = 2; 
        else if(data < 0xFFFF     && length != 2) length = 4; 
        else if(data < 0xFFFFFF   && length != 4) length = 6; 
        else if(data < 0xFFFFFFFF && length != 6) length = 8; 
    
        unsigned int  reverse_counter = length; 
        unsigned int  counter[8]      = {0}; 
        unsigned int  temp            = 0; 
    
        for (unsigned int i= 0; i < length; i++) 
          { 
            temp = data % 16; 
            data /= 16; 
            data-temp; 
            counter[i] = temp; 
          } 
        for(unsigned int i = 0; i< length ; i++) 
          { 
            hex[--reverse_counter] = (char)array[counter[i]]; 
          } 
        hex[length] = '\0'; 
        return hex; 
      }
    


  • Warum macht ihr es so kompliziert und erfindet das Rad neu, für was gibt es iomanip???

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
        int i = 1234;
        cout << hex << i << "\n" << dec << i;
        return 0;
    }
    

    Ausgabe:

    4d2
    1234
    

Anmelden zum Antworten