PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie funktioniert Maskerieren?



Lin728
26-10-2003, 18:41
Es gibt ja unter Java/C(++) die Möglichkeit werte zu "maskerieren".
Ganz viel wird diese Technik bei SWT genutzt, man hat einen int-parameter in einer Methode und hängt mit '|' die einzelnen Argumente zusammen.

Was ich machen will:
Ich habe eine Variable die Werte zwischen 0-100 annehmen kann, eine boolsche und eine andere die 0-25 hat. Ich würde diese Variablen gerne in einem einzelnen byte verpacken um netzwerktraffic zu sparen.
Ich dachte das eventuell maskerieren eine gute idee wäre, gibts vieleicht noch andere Techniken, diese Informationen wieder aus dem dezimal-wert herauszubekommen?

arthur
26-10-2003, 19:39
also ich kenne nur 'maskieren' und damit ist ein binäres AND gemeint,
damit kannst du bestimmte bits filtern, und das binäre OR '|' wird dazu benutzt
um bits zu setzten.
zu deiner frage, eine zahl zwischen 0-100 brauch schon 7 bits (127)
dh. du könntest noch den boolean mitnehmen, für die 0-25 brauchst du noch
5 bits, also 13 bits gesamt

gruss
Arthur

anda_skoa
26-10-2003, 22:02
Man kann auch am falschen Ende sparen.
Bei sowas wird nur der Rechenaufwand größer, die Wartbarkeit des Codes sinkt und die Fehlersuche wird schwieriger.

Bitmasken benutzt man nur dann, wenn man eine sehr begrenzte Anzahl von Zuständen hat, die in Kombinationen auftreten können.

Ciao,
_

Lin728
27-10-2003, 06:33
@arthur:
Ja genau, sowas meine ich!
Kennst du zufällig eine Anleitung wie das geht? Google hat mir nicht wirklich weitergeholfen.

@anda_skoa:
Normalerweise mach ich sowas eh nicht, ich möchte erst mal sehen, wieviel Rechenzeit das ganze benötigt.

peschmae
27-10-2003, 08:08
ich hab mal sowas in Delphi gebraucht - für ein Primzahlensieb. Dort hats wirklich was gebracht, an Speicher - aber sonst würd ich das eher sein lassen.
Ist recht viel Aufwand für recht wenig ertrag in den meisten fällen.

MfG Peschmä

anda_skoa
27-10-2003, 08:49
Original geschrieben von ceisserer
@anda_skoa:
Normalerweise mach ich sowas eh nicht, ich möchte erst mal sehen, wieviel Rechenzeit das ganze benötigt.


Wie gesagt rate ich davon ab. Reduziert die Robustheit des Codes enorm.
Wenn du Datenmenge am Übertragungsweg sparen willst, weil es zB keine Netzwerkverbindung sonder nur eine Serielle Leitung ist, dann wäre ein CompressionStream vermutlich besser.

Ciao,
_

Lin728
27-10-2003, 08:50
Kennt wer ne Anleitung, damit ich mir mal ein Bildchen machen kann?

anda_skoa
27-10-2003, 11:04
Original geschrieben von ceisserer
Kennt wer ne Anleitung, damit ich mir mal ein Bildchen machen kann?

Für Streamcompression?
siehe java.util.zip
Zum Beispiel mit DeflaterOutputstream und InflaterInputStream.

Ich geh mal davon aus, dass du schon weißt, wie man Streams ineinander hängt :)

Ciao,
_

Lin728
27-10-2003, 12:23
Diese netten Klassen funktionieren nicht über Sockets! Das ist ein allgemeiner Bug und konnte auch seitens SUN nicht gelöst werden, da die zip-Routinen auf der nativen Z-LIB basieren und die das halt nicht kann.

Man kann ein einziges mal übertragen, danach muss man finish() aufrufen und der Stream ist hin.
Flush geht nicht, nen neuen Stream kreieren auch nicht.

anda_skoa
27-10-2003, 14:27
Original geschrieben von ceisserer
Man kann ein einziges mal übertragen, danach muss man finish() aufrufen und der Stream ist hin.
Flush geht nicht, nen neuen Stream kreieren auch nicht.

Mann, Softwarequalität wie bei Microsoft :(
Und sowas liefern die aus!
Ist ein schöner Müll, wenn man sich nicht mal in der Standard Class Lib daruf verlassen kann, das etwas geht.

Falls du Pakete übertragen kannst, wäre es eine Möglichkeit, ein Paket zuerst in einem DataArray Stream zusammen zu bauen und dann zu versenden.



PS: Wie geht maskieren?

in etwa so


byte a = 2;
byte b = 3;
int i = a;
i << 8;
i += b;

b = (byte) (0xFF & i);
i -= b;
i = i & 0xFF00;
i >> 8;
a = (byte) (0xFF & i);


ciao,
_

Silver
27-10-2003, 18:32
also bevor ich sowas machen würde.... ;)

aber habe eine Interessensfrage: was bedeutet 0xFF00 ?!? ist das nun 255 im Dez.System? Oder ist das größer als ein 1Byte?!?

mfG

Lin728
27-10-2003, 19:25
Naja, verstehe zwar nur bahnhof aber is schon gut so....

:-(

Trillian
27-10-2003, 19:41
typedef enum {
FLAG_WRITE = 1,
FLAG_READ = 2,
FLAG_EXEC = 4
} Flags;

int i = 0;

i = i | FLAG_WRITE; /* Write-Flag setzen */
i = i | FLAG_READ; /* Read-Flag setzen */

if (i & FLAG_EXEC)
printf("Exec-Flag gesetzt\n");


Hab leider kein Plan von Java, hoffe das ist so verständlich.

& ist AND, | ist OR.

anda_skoa
27-10-2003, 20:33
@Trillian: in Java muss eine Bedingung immer boolean liefern, aber sonst ist es gleich


if ((i & FLAG_EXEC) != 0)


@Silver:
0xFF ist 255
Jede Stelle hat die 16 fache Wertigkeit der vorherigen (Hexadezimal)
0xFF00 ist also 16^3 * 15 + 16^2 * 15 + 16^1 * 0 + 16^0 * 0 = 65280

@ceisserer:
i << 8 verschiebt alle Bits in i um 8 Stellen nach links
Da dort nur max. die ersten 8 Bit besetzt sind (a ist ein byte), belegen die Bits von a jetzt die bits 8-15
Dann wird b dazu addiert, was maximal die untersten 8 Bit von i verändert.

Bei Lesen so ähnlich.
Die Verknüfung mit 0xFF macht alles bis auf die untersten 8 Bit zu 0, der Wert des resultierenden ints ist als gleich b
Das zieht man dann ab, Umkehroperation zu Addition beim Schreiben.
Dann blendet man in i alles aus, was nicht zu a gehören kann.
Dann werden die Bits von a wieder nach rechts geschoben und fertig

Ciao,
_