Was passt an meiner HexToInt nicht ? (TColor intern anders?)



  • Hi, folgender Code gibt mir die Hexadezimalzahl (6-stellig) anscheinend verkehrt herum aus:

    //für einzelne Hex-Ziffern
    unsigned int TForm1::HexCharToInt(char c){
    
     if(c >= '0' && c <= '9')
            return (c - '0');
     unsigned int i = 0;
     switch(c){
            case 'A':
            case 'a': i = 10; break;
            case 'B':
            case 'b': i = 11; break;
            case 'C':
            case 'c': i = 12; break;
            case 'D':
            case 'd': i = 13; break;
            case 'E':
            case 'e': i = 14; break;
            case 'F':
            case 'f': i = 15; break;
            default:  i = 0;
     }
     return i;
    }
    
    unsigned int TForm1::HexToInt(AnsiString s)
    {
            char *ch= new char[7];
            ch = s.c_str();
            unsigned int col= HexCharToInt(ch[5])*0x1
                            + HexCharToInt(ch[4])*0x10
                            + HexCharToInt(ch[3])*0x100
                            + HexCharToInt(ch[2])*0x1000
                            + HexCharToInt(ch[1])*0x10000
                            + HexCharToInt(ch[0])*0x100000 ;
    
            return col;
    }
    

    Die Fkt. HexToInt soll eine 6-stellige Hex-Zahl in eine Int umwandeln.
    Es ist doch so, dass rechts (also bei ch[5]) die niedrigst-wertige Ziffer steht (ch[5] * 0x1) und links die Höchstwertige. Richtig?

    Wieso arbeitet dieser Code dann falsch?
    (Wenn ich die Reihenfolge der chs umkehre, dann ist die Zahl auch noch nicht ganz richtig.

    Vielen Dank schon mal.



  • unsigned int HexCharToInt(char c){
    
     if(c >= '0' && c <= '9')
            return (c - '0');
     unsigned int i = 0;
     switch(c){
            case 'A':
            case 'a': i = 10; break;
            case 'B':
            case 'b': i = 11; break;
            case 'C':
            case 'c': i = 12; break;
            case 'D':
            case 'd': i = 13; break;
            case 'E':
            case 'e': i = 14; break;
            case 'F':
            case 'f': i = 15; break;
            default:  i = 0;
     }
     return i;
    }
    
    unsigned int HexToInt(string s)
    {
            unsigned int col= HexCharToInt(s[5])*0x1
                            + HexCharToInt(s[4])*0x10
                            + HexCharToInt(s[3])*0x100
                            + HexCharToInt(s[2])*0x1000
                            + HexCharToInt(s[1])*0x10000
                            + HexCharToInt(s[0])*0x100000 ;
    
            return col;
    }
    

    So könnte es funktionieren. Mußt halt nur darauf achten, daß der Index von AnsiString bei 1 anfängt...

    Nur muß der String immer mindestens 6 zeichen lang sein, sollte man vielleicht prüfen!



  • ehm...es geht auch so, wie ich es gemacht habe...aber ich vielleicht vergessen etwas zu erwähnen...ich brauche die Umwandlung für TColor. Aber anscheinend stellt TColor die Wertigkeiten intern etwas anders dar, denn ich habe grade ein bissl probiert und so geht es dann:

    TColor TForm1::HexToTColor2(AnsiString s)
    {
            char *ch= new char[7];
            ch = s.c_str();
    
            unsigned int col= HexCharToInt(ch[0])*0x10
                            + HexCharToInt(ch[1])*0x1
                            + HexCharToInt(ch[2])*0x1000
                            + HexCharToInt(ch[3])*0x100
                            + HexCharToInt(ch[4])*0x100000
                            + HexCharToInt(ch[5])*0x10000 ;
    
            return (TColor)col;
    }
    

    Jetzt weiss ich nur noch nciht so genau warum.... 😞
    Ist es wirklich so, dass TColor die Stellen vertauscht?



  • Oh, sorry, mein Compiler hat wegen dem fehlenden const gemeckert 🙂

    aus einem anderen Thread über TColor:

    Jester2000 schrieb:

    aber pass auf, wenn du ein 0x davorhänst, dann ist die reihenfolge der farbwerte die dahinterstehen nicht RGB sondern BGR


Anmelden zum Antworten