Anzeige:
Ergebnis 1 bis 14 von 14

Thema: Wie funktioniert Maskerieren?

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Wie funktioniert Maskerieren?

    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?
    Geändert von Lin728 (19-08-2017 um 18:35 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    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
    ---------
    irc.mrunix.de #mrunix

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182
    @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.
    Geändert von Lin728 (19-08-2017 um 18:35 Uhr)

  5. #5
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: Jo genau!!

    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Wie gehts...

    Kennt wer ne Anleitung, damit ich mir mal ein Bildchen machen kann?

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: Wie gehts...

    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182
    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.
    Geändert von Lin728 (19-08-2017 um 18:35 Uhr)

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: NÖÖÖÖ...

    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
    Code:
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer
    Registriert seit
    19.04.2003
    Beiträge
    194
    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
    Going to church does not make a person religious, nor does going to school make a person educated, any more than going to a garage makes a person a car.

  12. #12
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    hmm....

    Naja, verstehe zwar nur bahnhof aber is schon gut so....

    :-(

  13. #13
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Code:
    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.

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    @Trillian: in Java muss eine Bedingung immer boolean liefern, aber sonst ist es gleich
    Code:
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •