struct soll 24 byte sein, ist 28 gross?
-
hallo,
wie kann das sein, ich will etwas aus einer Datei in eine struct laden, diese sollte 24 Byte groß sein, ist aber 28 byte groß (laut sizeof):
typedef struct _nsvsHeader { long nsvs4cc; long video4cc; long audio4cc; short video_width; short video_height; char framerate; short synoffset; char BIbyte; short aux_video_len; short audio_len; } NSVSHeader;
wie kann das sein?
Bitte um Hilfe, Danke.
-
padding
man laedt nicht aus binaries in structs, gerade WEIL du schwer garantieren kannst, wie ein struct ausgerichtet ist.
-
versuchs mal mit
typedef struct _nsvsHeader { long nsvs4cc; long video4cc; long audio4cc; short video_width; short video_height; char framerate; short synoffset; char BIbyte; short aux_video_len; short audio_len; } __attribute__ ((packed)) NSVSHeader;
is aber nicht garantier dass dein compiler das unterstütz. das problem kommt übrigens daher, dass dein compiler aus performancegründen lücken zwischen den elementen lässt. es ist also nicht unbedingt von vorteil die struktur auf ein minimum zusammen zu pressen.
-
Also kann ich nur eine struct laden, welche ich zuvor von der selben gespeichert habe.
Könnte ich das den mit fscanf lösen?
aka://a = struct fscanf(&a.long,&a.long,&a.long,&a.short,&a.short,&a.char,&a.short,"%l%l%l....);
Was müßte ich den für short (16bit) angeben im Scanstring und ist %l richtig für long?
oder ehr %d
-
Was ist wenn man Bitfelder verwendet?
typedef struct _nsvsHeader { long nsvs4cc:32; long video4cc:32; long audio4cc:32; short video_width:16; short video_height:16; char framerate:8; short synoffset:16; char BIbyte:8; short aux_video_len:16; short audio_len:16; } NSVSHeader;
Wäre dann garantiert, das es nur 24 byte groß ist?
-
nein, leider nicht, damit sind nur die Member gesichert, die struct ist immer noch 28 Byte groß.
-
Hi!
Versteh ich hier was falsch? Soertier doch einfach die einzelnen Datentypen absteigen, nach Größe in der Struktur! Also wenn ich das mache, dann zeigt sizeof() 24Byte an:typedef struct _nsvsHeader { long nsvs4cc; long video4cc; long audio4cc; short video_width; short video_height; short synoffset; short aux_video_len; short audio_len; char framerate; char BIbyte; } NSVSHeader;
Stichwort Alignment
mfg
blut-lecker
-
@blut-lecker
Du hast da was falsch verstanden:
Ich wollte ja die komplette struct in einen rutsch einlessen (ist der Header eines NSVs Streams) statts die einz. Werte, wenn ich die Reihenfolge nicht einhalte, passt es ja nicht mehr zur Bytefolge im File, daher muß es schon 1:1 stimmen, sonst hats kein Sinn.Nun ja, ich lese das jetzt einz. ein und gut ist.
Noch ne Bemerkung neben bei, kann es sein das unter Windows mit dem Borland Compiler hton/ntoh nicht mehr das ist, was es soll?
Ich habe das Gefühl, der tauscht nicht die bytefolge, sondern die Bitfolge, tausche ich das durch eigene Routinen, ist es richtig.