Wie 32 bit Integer in Binärdatei schreiben/lesen?
-
Hallo beisammen,
ich arbeite gerade an einem kleinen Programm um in ID3-Daten herumzuschreiben. Um dort Frames zu verändern muss ich deren neue Größe als 32 bit synchsafe-Integer speichern. Umwandeln hin und zurück habe ich gelöst. Jetzt stellt sich mir die Frage:
Wie schreibe ich diese Integer in eine Binärdatei? Mit fwrite() bzw. fputs() schreibe ich textstrings und fputc() schreibt ja nur 8 bit...
Wahrscheinlich muss ich hierbei irgendwie mit Binärverschiebung arbeiten, aber das ändert ja auch nichts daran, dass fputc() nur 8 bit schreibt.
(Zusatzfrage: Wikipedia zum Thema Synchsafe schreibt die Funktion als int. Müsste das nicht eigentlich long int sein, weil int auch wieder nur 16 bit hat?)
Verwirrte Grüße...
-
fwrite ist Dein Freund:
int x;
...
fwrite((char*)&x, sizeof(x), 1, outfile);
...
wobei outfile ein Zeiger auf FILE ist.
-
WaechterT schrieb:
Müsste das nicht eigentlich long int sein, weil int auch wieder nur 16 bit hat
int
kann zwischen 16 und 32 Bit groß sein. Idealerweise so gewählt, dass das System damit am schnellsten rechnet.Wenn du sicher gehen willst, das die Variable 32 Bit hat, nimmst du
int32_t
aus<stdint.h>
-
ANSI C kennt keinen expliziten 32 Bit Integertyp.
Außerdem musst du die Bytefolge deines 32 Bit-Wertes kennen (Endian) um auf einen int Typ zu mappen, also z.B.int schreibe(unsigned wert,FILE *f) { unsigned char w[]={wert>>24,(wert>>16)&255,(wert>>8)&255,wert&255}; assert( sizeof(int)==4 ); return fwrite(w,4,1,f)==1; } int lese(unsigned *wert,FILE *f) { unsigned char w[4]; assert( sizeof(int)==4 ); if( !fread(w,4,1,f) ) return 0; *wert = (w[0]<<24) | (w[1]<<16) | (w[2]<<8) | w[3]; return 1; }
-
Danke für die Antworten.
Also den Trick, die Adresse eines Integers in einen String umzuwandeln bin ich nicht gekommen... sehr genialer Tipp.
Mit int32_t (also auf Nummer sicher) und fwrite() scheint es bis jetzt gut zu klappen
-
WaechterT schrieb:
Also den Trick, die Adresse eines Integers in einen String umzuwandeln bin ich nicht gekommen... sehr genialer Tipp.
Wo wurde das gemacht?
Falls du den Tipp von Belli meinst, da wurde nichts gewandelt und das
(char*)
ist noch nicht mal nötig.