2009-03-15 11 views
4

Comment écrire des bits (pas des octets) dans un fichier avec C#, .net? Je suis prévenu coincé avec ça.
Modifier: Je suis à la recherche d'une autre façon que l'écriture juste tous les 8 bits comme un octetComment écrire des bits dans un fichier?

Répondre

6

La plus petite quantité de données que vous pouvez écrire en même temps est un octet.

Si vous devez écrire des valeurs de bit individuelles. (Comme par exemple un format binaire qui nécessite un drapeau de 1 bit, un entier de 3 bits et un entier de 4 bits); vous devez mettre en mémoire tampon les valeurs individuelles en mémoire et écrire dans le fichier lorsque vous avez un octet entier à écrire. (Pour la performance, il est logique de tamponner plus et d'écrire des morceaux plus gros dans le fichier).

+0

Malheureusement c'est ce que je m'attendais. Je voulais juste éviter le problème d'écrire un nombre de bits qui ne divisent pas par 8 mais je vais devoir le gérer – agnieszka

0

Vous devrez utiliser bitshifts ou arithmétique binaire, comme vous ne pouvez écrire un octet à la fois, et non individuelle morceaux.

4
  1. accumuler les bits dans une mémoire tampon (un seul octet peut être considéré comme un « tampon »)
  2. lors de l'ajout d'un bit, de gauche déplacer le tampon et mettre le nouveau bit dans la position la plus basse en utilisant OR
  3. Une fois le tampon saturé, ajoutez-le au fichier
0

J'ai créé quelque chose comme ceci pour émuler un BitsWriter.

private BitArray bitBuffer = new BitArray(new byte[65536]); 

    private int bitCount = 0; 


    // Write one int. In my code, this is a byte 
    public void write(int b) 
    { 
     BitArray bA = new BitArray((byte)b); 
     int[] pattern = new int[8]; 
     writeBitArray(bA);    
    } 

    // Write one bit. In my code, this is a binary value, and the amount of times 
    public void write(int b, int len) 
    { 
     int[] pattern = new int[len]; 
     BitArray bA = new BitArray(len); 
     for (int i = 0; i < len; i++) 
     { 
      bA.Set(i, (b == 1));     
     } 

     writeBitArray(bA); 
    } 

    private void writeBitArray(BitArray bA) 
    { 
     for (int i = 0; i < bA.Length; i++) 
     { 
      bitBuffer.Set(bitCount + i, bA[i]); 
      bitCount++; 
     } 

     if (bitCount % 8 == 0) 
     { 
      BitArray bitBufferWithLength = new BitArray(new byte[bitCount/8]);     
      byte[] res = new byte[bitBuffer.Count/8];    
      for (int i = 0; i < bitCount; i++) 
      { 
       bitBufferWithLength.Set(i, (bitBuffer[i])); 
      } 

      bitBuffer.CopyTo(res, 0); 
      bitCount = 0; 
      base.BaseStream.Write(res, 0, res.Length);             
     }   
    } 
Questions connexes