struct packen geht nicht.....
-
hallo leute,
ich habe folgendes problem:ich habe einen struct für das fat12 datum- und zeitformat.
die sind beide aber 4 statt 2 byte groß (sizeof())...
wie kann ich die nun packen?
#pragma und __attribute__ gehen beide irgendwie nicht.
ich mache das ganze mit vs2005//#pragma pack(1) <- geht nicht struct FAT_time /* Warning: this struct must be packed */ { unsigned two_secs : 5; /* low 5 bits: 2-second increments */ unsigned minutes : 6; /* middle 6 bits: minutes */ unsigned hours : 5; /* high 5 bits: hours (0-23) */ }; // __attribute__ ((packed)); <- geht nichtdanke im voraus
Uni_Sol
-
EDIT: * ignorance induced junk removed *
-
Simon2 schrieb:
also ein struct mit 3 Elementen wirst Du nur seeehr schwer in 2 Bytes unterbekommen.
Was spricht dagegen, 16 Bit in 2 Byte unterzubringen?
BTW: "unsigned was" ? Ich bin mir gar nicht sicher, dass das C++-Syntax ist, was Du da anbietest ? (" .. : 5 ..." ?)
Da das eine C-Struktur sein dürfte (Filesystem-Header), default-int, also ist "unsigned" hier "unsigned int". Und imho ist das für C++ sogar immernoch gültig, da default-int nur bei Funktionsrückgabetypen verboten ist.
EDIT 2 (siehe unten):
Das funktioniert übrigens unabhängig von pragma pack(1). sizeof ist immernoch 4, das dürfte am Alignment des Bitfields auf Integer (4 Byte) liegen. Wenn man sich die Struktur dann aber mal visualisiert liegen die Bits genau richtig.FAT_time x = { 16 /* Bit 5 gesetzt */, 32 /* Bit 6 gesetzt */, 16 }; cout << *reinterpret_cast<int*>(&x) << endl;Ausgabe: 33808, binär 1000010000010000
-
geht denn das hier?
//#pragma pack(1) <- geht nicht struct FAT_time /* Warning: this struct must be packed */ { unsigned short two_secs : 5; /* low 5 bits: 2-second increments */ unsigned short minutes : 6; /* middle 6 bits: minutes */ unsigned short hours : 5; /* high 5 bits: hours (0-23) */ }; // __attribute__ ((packed)); <- geht nichtich würde bei dem bitfield das problem nicht auf packen schieben, sondern aufs alignment.
-
In der Tat, funktioniert es auch ganz ohne pragma pack...
-
EDIT: * ignorance induced junk removed *
-
Simon2 schrieb:
Nichts. Und ? Habe ich was Anderes behauptet ?

Im Grunde ja, Du hast behauptet dass drei Elemente (5+6+5 Bit = 16 Bit) nicht in zwei Byte passen können

LordJaxom schrieb:
Ist mir schon klar, aber mit meiner Frage wollte ich bsunisol mal zum Nachdenken anregen, wieviel Platz denn wohl 3 int's brauchen könnten.

siehe oben

-
Simon2 schrieb:
Ist mir schon klar, aber mit meiner Frage wollte ich bsunisol mal zum Nachdenken anregen, wieviel Platz denn wohl 3 int's brauchen könnten.

Offensichtlich 3*sizeof(int). Aber deine Unsicherheit bezüglich der Syntax ("... : N;") hätte dich lieber mal zum Nachdenken anregen sollen.

-
finix schrieb:
...deine Unsicherheit bezüglich der Syntax ("... : N;") hätte dich lieber mal zum Nachdenken anregen sollen.

Hat es, hat es, keine Sorge.

Aber ehrlich gesagt: Dass das weder mir noch meinen 4 C(++)-erfahrenen Kollegen (alle schon mehrere Jahre im Geschäft) noch nie begegnet ist (und alle spontan sagten: "Das kann gar nicht kompilieren"), verwundert schon ein wenig.Gruß,
Simon2.
-
nein es geht alles nicht.
wenn ich datei dann mit einem hex editor öffne ist der struct größer als ich ihn haben will...beispiel:
so müsste es aussehen:
struct 1:4B 45 52 4E 45 4C 20 20 53 59 53 20 00 41 D8 6A 24 35 24 35 00 00 A0 AA DD 34 02 00 44 00 00 00struct 2:
4F 53 4C 44 52 20 20 20 20 20 20 20 00 0f DA 6A 24 35 24 35 00 00 A0 AA DD 34 02 00 44 00 00 00aber meine sehen so aus:
54 45 53 54 20 20 20 20 54 58 54 10 00 CD CD CD 3E 53 CD CD 24 35 CD CD 24 35 CD CD 00 00 CD CD 3E 53 CD CD 24 35 CD CD 19 00 CD CD 00 04 00 00ich bin am verzweifeln.....
Uni_Sol