Binär File schreiben
-
Hi Leute,
Ich habe so eine Methode geschrieben:
Zuerst gibt es ein for Schleife, die 0- Bit oder 1 - Bit mehrmals ausgibt, bis der Buffer voll (8 Bit )ist. Dann muss diese Buffer in outputfile reingeschrieben werden. int buffer =0; int bit2go =8; void outputbit(FILE *outfp, int bit){ buffer >>=1; if (bit) buffer |= 0x80; bit2go -=1; if (bit2go ==0) { fwrite( &buffer, 1, 1, outfp); bit2go =0x80; } }
Ich weiss nicht ,aber Ich ein einziges Byte (voller Buffer) in binär outputfile schreiben kann.
Wenn Ich fwrite( &buffer, 1, 1, outfp);
Kriege Ich immer komische Grössen von Outputfile zurück.Das ganze Programm schreibt mehrmals Buffer in Outputfile rein.
Wenn Ich z.B. habe:
i =0: 11111110
i=1: 1011010
i=2: 01110011
i=3: 0100011
i=4: 010011110
i=5: 0101011
i =6: 00110100Der Buffer, muss jedesmal die 8 Bit in outputfile schreiben;
Es wäre super, wenn mir jemand helfen würde.
Im voraus Vielen Dank
lena
-
Kannst du mal die zugehörige for()-Schleife genauer zeigen? Aus der Beschreibung geht nicht wirklich hervor, was das werden soll.
Und was genau ist "outputf"? Eventuell mußt du dort noch einen Adressoperator einbauen.
-
Das Teil des Programms:
for (i=0; i< entries; i++){ int c; if (fread (&array[i], (blocksize/8), 1, inputfile)== 0) break; c = array[i]; encodeSymbol (c, ,.....); } void encodeSymbol (int c, .....){ long range; range = (long) ((ace->high)- (ace->low))+1; .................................... // loop to output bits for (; ;){ if (ace->high < Half){ bitplusflow(outfp, 0, ace); // output 0, if in low Half } else if (ace->low >= Half){ bitplusflow(outfp, 1, ace); // output 1, if in low Half ace->low -=Half; ace->high -=Half; // and then take away offset } .............................................. else break; // otherwise exit loop ace->low = 2 *ace->low; // Scale up code range ace->high = 2 *ace->high +1; } } // output bits plus following opposite bits static void bitplusflow(FILE *outfp, int bit, encod *ace){ outputbit(outfp, bit); // output the bit ............................. } void outputbit(FILE *outfp, int bit){ buffer >>=1; if (bit) buffer |= 0x80; bit2go -=1; if (bit2go ==0) { fwrite( &buffer, 1, 1, outfp); bit2go =8; } }
Ich habe nicht alles geschrieben, da es ziemlich viel ist, aber die wichtigste habe Ich geschrieben.
Ich rufe in der Schleife
for
(entries =7) für jede Instruction (Symbol) die Methode encodeSymbol () auf.
In Methode encodeSymbol () berechne Ich Intervalle für jeden Symbol.
Wenn der Interval in der oberen Hälfte des Hauptintervalls liegt, dann schreibe Ich bit-1 in buffer, wenn in unteren dann bit-0.
Ich mache es so lange, bis der Intervall gross genug ist, und nicht mert in unteren oder in oberen Hälfte liegt.Das mache Ich für jeden Symbol.
Ich habe so ein Ergebnis erhalten:
i =0: 11111110
i=1: 1011010
i=2: 01110011
i=3: 0100011
i=4: 010011110
i=5: 0101011
i =6: 00110100Ich muss jedes mal den Buffer mit 8 bits auffüllen und dann in Outputfile schreiben.
Ich habe Problem mit fwrite, Ich weiss nicht, wie Ich dieses Befehl schreiben soll.
Es wäre toll, wenn du mir hefen würdest.
Im Voraus Vielen Dank.
-
Eigentlich sieht der fwrite()-Eintrag so richtig aus - allerdings könnte die Bit-Verteilung eines int dir Schwierigkeiten machen. Da solltest du lieber ein unsigned char für deinen Puffer verwenden.
(PS: Und nach dem Ausgeben des Puffers würde ich die alten Daten rausschmeißen)
-
Vielen Dank für deinen Antwort.
Ich habe noch eine Frage:
Wie schmeise Ich die alte Daten raus?(PS: Und nach dem Ausgeben des Puffers würde ich die alten Daten rausschmeißen)
Vielen Dank
Lena
-
indem du zusammen mit "bit2go" auch den buffer wieder auf den Ursprungswert setzt.
btw, wenn du die Variablen von außerhalb nicht brauchst, würde ich sie in die Funktion setzen - als static, damit sie sich nicht bei jedem Aufruf löschen:
void outputbit(FILE* file,bool bit) { static char buffer=0; static int bit2go=8; //... }
-
Vielen Dank für deinen Antwort, das hat mir sehr geholfen.
Ich habe die beide Variablen: buffer; bit2go;
Ausserhalb aller Methoden alsstatic
deklariert.
Aber Ich brauche die beide Variablen in einer anderer Methode.
Ich initialisiere bevor for - Schleife ein Output-bitstream mitstatic char buffer; static int bit2go; void Output_bitstream (){ buffer =0; bit2go =8; }
Ich habe bei mir Fehler gefunden, das wenn Ich ersten Symbol codiert habe,
und der Buffer voll ist (in meinem Beispiel Buffer bekommt: 11111110 ), möchte Ich das Buffer leeren, damit er wieder leer ist, aber das ist nicht so.
Und Ich weis nicht, wie Ich den buffer wieder leer bekomme.