Hex to 4 ints



  • Hi,

    ich hab ein problem, ich hab eine Hexzahl:

    0xFF00FFFF (also ARGB = 255, 0, 255, 255)

    doch wie kann ich den jetzt in 4 Ints umwandeln?

    z.B. hab ich eine struct und eine funktion:

    struct colors
    {
    int a, r, g, b;
    };
    
    colors convert (const int color)
    {
        colors ret;
    
        // Hier möchte ich die Daten aus dem Hexwert extrahieren, doch wie?
        ret.a = color (irgendwas) // ersten 2 Ziffern/Buchstaben nach dem x
        ret.r = color (irgendwas) // zweiten 2 Ziffern/Buchstaben nach dem x
        ret.g = color (irgendwas) // dritten 2 Ziffern/Buchstaben nach dem x
        ret.b = color (irgendwas) // letzte 2 Ziffern/Buchstaben 
    
        return (ret);
    }
    

    nun meine frage: wie zum geier mach ich das?



  • Das machst du mit dem & und den Shift-Operatoren.

    colors convert (const int color)
    {
        colors ret;
    
        // Hier möchte ich die Daten aus dem Hexwert extrahieren, doch wie?
        ret.a = (color /*& 0xFF000000*/)>>24 // ersten 2 Ziffern/Buchstaben nach dem x
        ret.r = (color & 0x00FF0000)>>16 // zweiten 2 Ziffern/Buchstaben nach dem x
        ret.g = (color & 0x0000FF00)>>8  // dritten 2 Ziffern/Buchstaben nach dem x
        ret.b = (color & 0x000000FF)     // letzte 2 Ziffern/Buchstaben 
    
        return (ret);
    }
    

    Die Erklärung dazu erhältst du vielleicht von wem anderen, falls nötig 🙂



  • Anstatt einem int solltest du einen long übergeben, da int auch nur 2 Bytes groß sein kann. Ein long dagegen ist 4 Bytes groß. Dann ist mir noch aufgefallen, dass du eine lokale Variable zurückgibst. Gefährlich, da lokale Variablen am Ende der Funktion wieder freigegeben werden! Es wäre also besser, wenn du den Rückgabewert gleich als Übergabeparameter (und damit als Zeiger) verwendest.

    Die eigentliche Problematik hat Azis ja bereits geklärt ;).



  • [quote="AJ"] Dann ist mir noch aufgefallen, dass du eine lokale Variable zurückgibst. Gefährlich, da lokale Variablen am Ende der Funktion wieder freigegeben werden! Es wäre also besser, wenn du den Rückgabewert gleich als Übergabeparameter (und damit als Zeiger) verwendest.
    [quote]

    Was is daran bitte gefährlich? Das Ergebnis wird einfach per Value an die aufrufende Funktion zurückgegeben. Da is garnix gefährlich...



  • Oh stimmt. Tschuldigung, ich war auf Zeiger eingeschossen. Also vergesst den Teil 😉


Anmelden zum Antworten