bitfield selbst/direkt im speicher anlegen



  • Ich bin gerade daran eine bestimmte Bibliothek zu verallgemeinern. Die alte Variante hatte als Schnittstelle ein 32byte großen bitfield. bzw. konnte man die Schnitstelle benutzen in dem man einen void Pointer übergab und die korrekte Länge mitteilte - eben 32byte. dann wurde entweder in diesen speicher geschrieben (get) oder die Bibliothek las aus diesem Bereich und setzte interne Variablen entsprechend (set).

    Die Verallgemeinerung sieht nun ein beliebiges bitfield vor, d.h. die "struct"-tur ist nicht festgelegt (die Länge bleibt bei 32byte, die struktur war so aufgefüllt, das keine Lücken waren). -- derVollständigkeit halber: die Struktur wird nun über ein xml-Dokument festgelegt (entweder mit einkompiliert oder zur Laufzeit geladen)--.

    Letztendlich muss ich also zur Laufzeit Werte bzw. ein Bitfeld in den Speicher schreiben bzw. Werte davon auslesen. Und das ohne "struct" zu verwenden.
    Funktionsrümpfe sähen dann ca. so aus:

    void set(int bitpos, int length,int value)
    int get(int bitpos, int length,int value)
    

    Man hat dann z.b. 4 bool werte und ein 4bit int wert den man in ein byte schreiben muss bzw. diese Werte oder einen davon auslesen muss. Gibt es z.b. fertige Funktionen mit denen ich die Bitbelegung eines Bytes manipulieren kann? Oder kommen ich um Bitgeschieb/ver-odern usw. nicht herum?
    Strukturell würde ich gerne mit nem QBitArray(http://doc.trolltech.com/4.5/qbitarray.html) arbeiten?! - Eine Klasse basteln die davon erbt und zusätzlich Funktionen bereitstellt die die oben genannte Funktionalität bereitstellen.

    Bevor ich mit wildem drauf los implementieren Anfange wollt ich hier mal nach Ideen Ausschau halten - falls irgendwer verstanden hat was ich will.



  • `std::bitset

    std::vector<bool>`



  • der bitset vorschlag ist glaube sehr gut, das hilft mir schonmal von werten zu bits zu kommen und umgekehrt.
    Aber wie mache ich aus z.B. 32 8bit-langen bitsets einen pointer. Also wie schreibe ich diese alle hintereinander in den Speicher? (Kann man ein Array von bitsets machen)
    Und umgekehrt wie bekomme ich aus einem Pointer der auf einen 256bit speicherbereich zeigt einzelne bit(sets) heraus?
    insgesamt sehen die schritte also so aus:

    int/bool wert<->bit feld<->256bit langer speicher bereich

    für den ersten Schritt kann man bitset ganz gut verwenden. Aber der zweite Schritt bereitet mir noch etwas Kopfzerbrechen.



  • Was bedeutet der Parameter length? Ich wuerde ihn weglassen.

    Oder kommen ich um Bitgeschieb/ver-odern usw. nicht herum?

    Das ist die einzige Moeglichkeit, auf Bits zuzugreifen. Aber du kannst es in einer Klasse schoen kapseln. Das Interface wurde ja schon von trolltech vorgeschlagen. Ein 256Bit langen Speicherbereich legt man an wie jeden anderen auch, z.B. durch new char[32]. Willst du auf einzelne Bits zugreifen, so musst du das entsprechende Byte (oder Integer) erst ausfindig machen und mittels Maske (berechnet aus dem Index oder lookup table) darauf zugreifen.


Anmelden zum Antworten