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: 00110100

    Der 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: 00110100

    Ich 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 als

    static
    

    deklariert.

    Aber Ich brauche die beide Variablen in einer anderer Methode.
    Ich initialisiere bevor for - Schleife ein Output-bitstream mit

    static 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.


Anmelden zum Antworten