Struct als Bitfeld?
-
Hallo,
ich muss aus einer Binärdatei Daten herausparsen. Das mache ich mittels Structs.
Nun mache ich es bisher so, dass ich mir ein entsprechendes Struct bastle und das dann auf die entsprechende Stelle in der Binärdatei referenziere. So geht das dann immer weiter, bis ich schließlich noch ein Struct mit Bitmasken habe.
Um mir das ganze etwas zu vereinfachen, hätte ich jetzt die Frage, ob ich ein Struct, das aus Bitfeldern besteht, in ein anderes Struct einbauen kann. Hat das dann auch die richtige Größe?
Als Beispiel nehmen wir mal an, ich möchte 6 Byte + 3 Bit an Daten aus der Binärdatei parsen:
struct B
{
unsigned int ElementA : 5;
unsigned int ElementB : 3;
unsigned int ElementC : 3;
};struct A
{
char ElementA[2];
char ElementB[3];
struct B;
};Würde das so funktionieren?
Danke!
Gruß
Shinzo
-
gabs da nicht sowas wie padding was einem da dazwischenfunzen kann oder gilt das nur für die Ablage im Speicher und nicht das lesen aus zB Dateien?
<pirate>
Was genau machtunsigned int ElementA : 5; // ^^^ das hier??
</pirate>
Ich würde jetzt denken das ist ein struct von 5 chars und 3 ints ... was denkt der Compiler?
-
struct B kann gar nicht die richtige Größe haben, wie auch, mit 11 Bit?
Der Compiler schiebt hier auf jeden Fall ein Padding ein, ich meine, irgendwo gelesen zu haben, dieses Padding geschieht bei Bitfeldern hinter den Membern, also nach ElementC werden 21 Bit eingeschoben.
Per Default sieht auch A anders aus als angenommen.
ElementA, Offset 0, Größe 2 -> kein Padding
ElementB, Offset 2, Größe 3 -> Padding 1 Byte
B b <- muss natürlich so heißen, Offset 8, Größe 4.
Mit #pragma pack(push,1) kann das Padding bei MSVC-Compilern auf 1 Byte gesenkt werden. Dann liegt b auch auf Offset 5 und A hat eine Größe von 9 Byte.
Generell würde ich die Verwendung von Bitfeldern im Umgang mit Binärdateien vermeiden, stattdessen selbst alignte Strukturen verwenden oder ein passendes Verhalten beim Compiler einstellen.
Du kannst ja mal soetwasB b; int i = 0xFF; *(&b) = *((B*)(&i));probieren, und schauen, wie es sich auf die Member von b auswirkt.
-
padreigh schrieb:
unsigned int ElementA : 5; // ^^^ das hier?*psuh*
-
padreigh schrieb:
padreigh schrieb:
unsigned int ElementA : 5; // ^^^ das hier?*psuh*
Such nach Bitfeld bei Google. http://www.cpp-tutor.de/cpp/le08/bitfelder.html
-
padreigh schrieb:
padreigh schrieb:
unsigned int ElementA : 5; // ^^^ das hier?*psuh*
Das ist, wie der Threadtitel ja schon vermuten lässt, ein bit-field. Unter dem Namen ElementA kann eine Variable von 5-Bit Größe angesprochen werden. Die Idee dahinter ist, dass bei mehreren solcher Bitfelder platzoptimierter Code erzeugt wird, aber die Details sind implemenation defined.