Schnelle Wandlung ASCII-HEX nach Binär



  • Tim schrieb:

    deines Dings (eine bessere Bezeichnung ist mir nicht eingefallen)

    naja, eigentlich würde man es als Makro bezeichnen xD



  • Das mit den Range-Checks wusste ich. Ich ließ sie weg, da es dem Threadsteller ja um Schnelligkeit ging. Und ein Zugriff auf ein Array ist nunmal schneller als bedingt ausgeführter Code (jedenfalls meistens). Ausserdem entnahm ich seinem Post, dass die Daten bereits in korrektem Format vorliegen. Eine Prüfung von Daten, die nicht überprüft werden müssen bzw. vorher schon geprüft wurden, ist ja unnötig.

    Gruß
    Don06



  • DrakoXP schrieb:

    da wäre das noch besser:

    #define HexCharToDWord(c) (unsigned long)(((c >= '0') && (c <= '9')) ? (c - '0') : ((((c >= 'A') && (c <= 'F')) ? (c - 'A') : ((((c >= 'a') && (c <= 'f')) ? (c - 'a') : (0xFFFFFFFF))))))
    

    lauter sprünge und vergleiche sind mit sicherheit viel langsamer als so'n simpler array-zugriff.
    🙂



  • Ich weiß ehrlich gesagt auch nicht, ob wir den OT richtig verstanden haben.
    Er will ja noch seine Nippel verschieben 😉

    EDIT: Mir fällt mal auf, dass der Thread im ANSI-C Forum is. Ich tausch mal std::cout mit printf aus.



  • Vielen Dank für die vielen Antworten!

    Und special thanks to Don06, das muss ich unbedingt ausprobieren, sieht vielversprechend aus.

    👍



  • Ich wusste doch, dass ich da vor kurzem mal was gefrickelt hab. Etwas langsamer als das von Don06 dafür weniger Speicherbedarf (auch bei groß-und kleinbuchstaben) und ebenfalls keine range-checks.

    unsigned char hex2bin(const unsigned char x){
        const unsigned char nums[2][10] = { { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9 },
                                   { 0, 10, 11, 12, 13, 14, 15,  0,  0,  0 } };
    
        return nums[x>>6][x&0xF];
    }
    


  • Wie wäre es mit einem einfachen switch-case ?

    int HexCharToInt( char* c )
    {
    	switch ( *c )
    	{
    		case '0':	return 0;
    			// ...
    		case 'F':	return 15;
    	}
    	return -1;
    }
    
    int main()
    {
    	char c = 'F';
    	printf( "%d", HexCharToInt( &c ) );
    	return 0;
    }
    


  • Die Frage ist, in wie weit der Kompiler das optimiert. Es geht ja um Schnelligkeit.

    Wieso übergibst du den Char als Pointer?



  • damit der char nicht extra noch einmal kopiert wird



  • Vergiss das mit dem Pointer und deklariere die Funktion als inline . Und schau dir unbedingt mal den Assembler Code bei eingeschalteter Optimierung (gcc -O3 -S) an.

    just my 2¢



  • Pedobear schrieb:

    Vergiss das mit dem Pointer und deklariere die Funktion als inline . Und schau dir unbedingt mal den Assembler Code bei eingeschalteter Optimierung (gcc -O3 -S) an.
    just my 2¢

    inline,
    ist das ansi c ?



  • wo sind wir denn hier schrieb:

    inline,
    ist das ansi c ?

    Ja, es ist ANSI C99.

    just my 2¢



  • Rafti schrieb:

    ... Kennt jemand eine tolle und extrem schnelle Methode?

    void Hex_Bin_64k(char* tab);
    
    int main() 
    { 
        // Das schnellste waere eine Tabelle,
        char tabelle[256*256] ; // fuer zweistellige Hexadezimalzahlen 
        char test;
        // bei der die hexadezimale Schreibweise als Index auf den Binärwert agiert.
        // Es ist eine Funktion zu schreiben, die die entsprechenden Binärwerte 
        // unter Beruecksichtigung von Gross- und Kleinschreibung in die Tabelle schreibt,
        // oder eine "globale" resp. "static" Tabelle als Ressource,
        // die die Binärwerte an richtiger Stelle enthaelt.
        Hex_Bin_64k (tabelle);
    
        test = tabelle['0a'] ;
    }
    
    void Hex_Bin_64k(char* tab)
    {
        unsigned char binaer = 0;
        unsigned short i = 0;
        char tmp1, tmp2;
    
        do
        {
              tmp1 = (char)i;
              tmp2 = (char)(i>>8);
    
              if (((tmp1 >= '0' &&  tmp1 <= '9') ||
                   (tmp1 >= 'A' &&   tmp1 <= 'F')) 
                  &&
                   ((tmp2 >= '0' &&  tmp2 <= '9') ||
                   (tmp2 >= 'A' &&  tmp2 <= 'F')))
              { 
                  tab[i] = binaer;
                  tab[i+32] = binaer; // Kleinschreibung beruecksichtigen
                  binaer++;
              }
             i++;
    
        }while (i);
    }
    

    MfG


Anmelden zum Antworten