# Byte-Code entschlüsseln (Bitmasks?)



## Novanic (12. Nov 2006)

Hi Leute,

ich würde gerne einen Code entschlüsseln der sich aus mehreren Buttons (siehe Konstanten im Code) zusammensetzen kann.
Z.B. bekomme ich von einer Methode den Code 20480 und eine andere Methode soll dann herausfinden können aus welchen Werten sie zusammengesetzt wurde (in diesem Fall 4096 und 16384).

Hat jemand eine Idee wie sich das lösen lässt? Ich habe im Zusammenhang auch was von Bitmasks gehört, aber da konnte ich nicht wirklich viel mit anfangen... (hab gegoogled und in diesem Forum gesucht).

Oder gibt es dazu vielleicht schon eine Implementierung in Java?


```
static final int BUTTON1 = 1;
static final int BUTTON2 = 2;
static final int BUTTON3 = 4;
static final int BUTTON4 = 8;
static final int BUTTON5 = 16;
static final int BUTTON6 = 32;
static final int BUTTON7 = 64;
static final int BUTTON8 = 128;
static final int BUTTON9 = 256;
static final int BUTTON10 = 512;
static final int BUTTON11 = 4096;
static final int BUTTON12 = 8192;
static final int BUTTON13 = 16384;
static final int BUTTON14 = 32768;
```

Danke schonmal im Voraus.

Gruß Nova


----------



## Wildcard (12. Nov 2006)

Mal ein Beispiel aus SWT:

```
/**
 * Returns a style with exactly one style bit set out of
 * the specified set of exclusive style bits. All other
 * possible bits are cleared when the first matching bit
 * is found. Bits that are not part of the possible set
 * are untouched.
 *
 * @param style the original style bits
 * @param int0 the 0th possible style bit
 * @param int1 the 1st possible style bit
 * @param int2 the 2nd possible style bit
 * @param int3 the 3rd possible style bit
 * @param int4 the 4th possible style bit
 * @param int5 the 5th possible style bit
 *
 * @return the new style bits
 */
static int checkBits (int style, int int0, int int1, int int2, int int3, int int4, int int5) {
	int mask = int0 | int1 | int2 | int3 | int4 | int5;
	if ((style & mask) == 0) style |= int0;
	if ((style & int0) != 0) style = (style & ~mask) | int0;
	if ((style & int1) != 0) style = (style & ~mask) | int1;
	if ((style & int2) != 0) style = (style & ~mask) | int2;
	if ((style & int3) != 0) style = (style & ~mask) | int3;
	if ((style & int4) != 0) style = (style & ~mask) | int4;
	if ((style & int5) != 0) style = (style & ~mask) | int5;
	return style;
}
```


----------



## Novanic (12. Nov 2006)

Hi, ich habe jetzt noch ein bisschen weiterrumprobiert und bin dann auf diese Lösung gekommen.

Fragt sich nur ob das jetzt eine gute Lösung ist. 
Deine Methode aus SWT habe ich irgendwie nicht wirklich verstanden. Lässt sich damit überhaupt das umsetzen was ich erreichen möchte? Die Methode benötigt ja mehrere Integer, ich möchte ja aber nur einen Wert übergeben und dann die darin enthaltenen Werte zurückbekommen.

Beispiel-Aufruf: divide(20480, 32768);


```
private static int[] divide(int aNumber, int aDivider)
    {
        int[] theArray = new int[12];

        int i = 0;
        while(aNumber > 0 && aDivider > 0)
        {
            if(aNumber >= aDivider && aDivider > 0)
            {
                aNumber = aNumber - aDivider;
                theArray[i++] = aDivider;
            } else {
                aDivider = aDivider / 2;
            }
        }
        return theArray;
    }
```

Gruß Nova


----------



## SnooP (13. Nov 2006)

Dir ist schon klar, dass die Zahlen die du da hast alles bestimmte binäre Stellen repräsentieren (sprich es sind 2er-Potenzen):
also sowas: 1, 10, 100, 1000

Mit Hilfe einer Bitmaske kann man herausfinden, ob ein bestimmtes Bit gesetzt ist an einer Stelle, da gilt:
(1001 & 1000) == 1000, da das & einen bitweisen Vergleich macht: 1&1=1, 0&0=0, 0&0=0, 1&0=0 --> 1000.
Für deine Button-Abfrage könntest du also so abfragen:
buttonValue & (BUTTON11 | BUTTON13) == (BUTTON11 | BUTTON13) ... die aktuelle Bitmaske ist also BUTTON11 | BUTTON13 und entspricht dezimal deiner 20480.


----------

