String -> Hey



  • Hallo,
    ich habe folgendes Problem: Ich habe eine Zeichenkette, welche ganz viele hexadezimale Zahlen repräsentiert.
    char* str = "42 AF 89 E4 ...";

    und möchte die Hexadezimalcodes extrahieren und in char's konvertieren, dazu habe ich mir folgende Routine ausgedacht, welche leider nicht funktioniert und ich keine Idee habe, wo der logische Fehler liegt...

    Übergeben wird der zweistellige Hexcode und soll mit Hilfe von ODER und SHIFT's konvertiert werden. Möglicherweise gibt es auch einen beseren Algorithmus, ich bin für konstruktive Vorschläge sehr dankbar.

    inline unsigned char hex2char(char hex[2])
    {
    	unsigned char result = 0x00;
    
    	switch(hex[1])
    	{
    	case 0: break;
    	case 1: result |= 0x01; break;
    	case 2: result |= 0x02; break;
    	case 3: result |= 0x03; break;
    	case 4: result |= 0x04; break;
    	case 5: result |= 0x05; break;
    	case 6: result |= 0x06; break;
    	case 7: result |= 0x07; break;
    	case 8: result |= 0x08; break;
    	case 9: result |= 0x09; break;
    	case 'A': result |= 0x0A; break;
    	case 'B': result |= 0x0B; break;
    	case 'C': result |= 0x0C; break;
    	case 'D': result |= 0x0D; break;
    	case 'E': result |= 0x0E; break;
    	case 'F': result |= 0x0F; break;
    	}
    
    	switch(hex[0])
    	{
    	case 0: break;
    	case 1: result |= (0x01 << 4); break;
    	case 2: result |= (0x02 << 4); break;
    	case 3: result |= (0x03 << 4); break;
    	case 4: result |= (0x04 << 4); break;
    	case 5: result |= (0x05 << 4); break;
    	case 6: result |= (0x06 << 4); break;
    	case 7: result |= (0x07 << 4); break;
    	case 8: result |= (0x08 << 4); break;
    	case 9: result |= (0x09 << 4); break;
    	case 'A': result |= (0x0A << 4); break;
    	case 'B': result |= (0x0B << 4); break;
    	case 'C': result |= (0x0C << 4); break;
    	case 'D': result |= (0x0D << 4); break;
    	case 'E': result |= (0x0E << 4); break;
    	case 'F': result |= (0x0F << 4); break;
    	}
    
    	return(result);
    }
    


  • Kann es sein, dass du bei den Zahlen die Apostrophe vergessen hast drumherum zu machen?

    case '1': result |= 0x01; break;
    


  • Ah, an solchen Kleinigkeiten hängts immer 😛
    Danke.



  • Geht übrigens noch einfacher:

    if      (hex[0]<='9' && hex[0]>='0') result  = (hex[0]-'0'   ) << 4;
    else if (hex[0]>='A' && hex[0]<='F') result  = (hex[0]-'A'+10) << 4;
    if      (hex[1]<='9' && hex[1]>='0') result |= (hex[1]-'0'   );
    else if (hex[1]>='A' && hex[1]<='F') result |= (hex[1]-'A'+10);
    

    (ungetestet)

    Kann rein theoretisch Probleme verursachen, wenn der Zeichensatz total kryptisch ist und die Zahlen und die Buchstaben nicht nebeneinander liegen (und ist bei keinem gebräuchlichen der Fall). Dafür ist es schneller und vor allem kürzer.



  • Das 'es geht noch einfacher' geht weiter:

    using namespace std;
        char* str = "42 AF 89 E4";
        istringstream buf( str ); // erfordert #include <sstream>
        buf >> hex;
        for( int zahl; buf >> zahl; )
            cout << zahl << " ";
    

    (getestet)

    Liefert

    66 175 137 228
    

    Gruß
    Werner



  • Werner Salomon schrieb:

    Das 'es geht noch einfacher' geht weiter

    Aber das 'es geht noch schneller' hört auf und kehrt zum 'es geht noch overflowiger, throwmeidender und viel, viel langsamer' um.



  • heija schrieb:

    Werner Salomon schrieb:

    Das 'es geht noch einfacher' geht weiter

    Aber das 'es geht noch schneller' hört auf und kehrt zum 'es geht noch overflowiger, throwmeidender und viel, viel langsamer' um.

    Na und? 🕶

    Wenn es nur ein paar Zahlen sind, so spielt das doch keine Rolle. Und wenn es ein paar Millionen Zahlen zum Lesen sind, so stellt sich immer die Frage, wo die herkommen, und warum sie erst in den String kopiert werden müssen, statt dass man sie gleich einliest.

    Schnelligkeit ist nicht das Maß aller Dinge. Daneben gibt es noch Einfachheit, Robustheit, Flexibilität und die fehlende Möglichkeit Fehler zu machen - mit anderen Worten: der Code kostet einfach weniger (Zeit & Geld).

    Gruß
    Werner


Anmelden zum Antworten