Attribute Bitweise mit Logischem Oder verknüpfen

Aus bknowledgebase
Zur Navigation springen Zur Suche springen

Einleitung[Bearbeiten]

Egal ob in CPlusPlus, was hier als Beispiel dienen soll, oder in anderen Programmiersprachen. Grundsätzlich lassen sich Attribute oder andere Informationen Über Bitweise Logische Oder Operationen zu einem Wert verknüpfen und somit in einer Variable speichern.

Beispiel[Bearbeiten]

Wenn man beispielsweise die CPlusPlus Windows Bibliotheken nutzt um Dateien zu verarbeiten stößt man auf Funktionen, die die Dateiattribute einzelner Dateien als "DWORD" also "Unsigned Long Integer" zurückliefern. Dies ist nur ein Wert, der aber viele Attribute enthalten kann.


Erklärung[Bearbeiten]

Hier werden "einfach" Attribute für jedes Bit Definiert. Siehe: https://docs.microsoft.com/en-us/windows/desktop/fileio/file-attribute-constants

Z.B stehen hier folgende Werte für verschiedene Attribute, die in entsprechend bezeichneten Konstanten hinterlegt sind.


Konstante Wert Hexadezimal Binär
FILE_ATTRIBUTE_ARCHIVE 32 0x20 00100000
FILE_ATTRIBUTE_DIRECTORY 16 0x10 00010000
FILE_ATTRIBUTE_HIDDEN 2 0x2 00000010


Wenn ich nun z.B. Einen Ordner habe, der sowohl die Eigenschaft "Archiv" als auch "Versteckt" hat wird werden die Eigenschaftsbits auf Bitebene einfach per logischem Oder verknüpft und können so in einem Integer gespeichert werden.

z.B.


00100000 (32)
00010000 (16)
00000010 (2)
------------ (logische ODER Verknüpfung aller drei Werte)
00110010 (ergibt 50)


In C++:

	int attributes;
	attributes = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN;
        cout << endl << attributes;

Ausgabe von Attributes ergibt somit 50 !

Auswertung[Bearbeiten]

Die Auswertung kann sehr leicht durch eine Umkehrung der Prozedur veranlasst werden. Durch die logische UND Verknüpfung.

Wenn wir bei unserem Beispiel bleiben und wir bekommen nun von einer Funktion/Methode den Wert 50 zurückgeliefert, dann müssen wir prüfen ob ein bestimmtes Attribut enthalten ist oder nicht.

Bsp: Ist das Objekt ein Odner (FILE_ATTRIBUTE_DIRECTORY - 16 - 00010000)

00010000 (16 - FILE_ATTRIBUTE_DIRECTORY)
00110010 (50 - Der Wert mit allen Attributen)
------------- (logisches UND)
00010000 (ergibt 16 = FILE_ATTRIBUTE_DIRECTORY)


In C++:


if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) //bedeutet also quasi.. "ist dieses attribut enthalten?" !!!
 {
  cout << endl << "Das ist ein Verzeichnis";
 }


durch die logische UND Verknüpfung mit dem Gesamtergebnis erhalten wir also genau dann das Gesuchte Attribut zurück, wenn es auch enthalten ist.

Fazit[Bearbeiten]

Ein Ziemlich Effektiver Weg also um viele verschiedene Attribute in einer Variablen zu speichern.

H@ppy H@cking