2009-03-15 13 views

答えて

6

一度に書き込むことができるデータの最小量は1バイトです。

個々のビット値を書き込む必要がある場合。 (例えば、1ビットフラグ、3ビット整数及び4ビット整数を必要とするバイナリフォーマットのように)。書き込むバイト全体があるときは、個々の値をメモリにバッファリングしてファイルに書き込む必要があります。 (パフォーマンスのために、より多くのファイルをバッファリングし、より大きなチャンクをファイルに書き込むことは理にかなっています)。

+0

残念ながら、これは私が期待したものです。私はちょうど8で分割しないビットの数を書くことで問題を避けたいと思ったが、私はそれを処理する必要があります – agnieszka

0

として、すべての8ビットを書き込むあなたは個人だけではない、一度に1つのバイトを書き込むことができますよう、bitshiftsまたはバイナリ算術を使用する必要があります別の方法を探していますビット。

4
  1. ビットを追加する場合は、バッファを左シフトし、最も低い位置用いOR
  2. に新しいビットを入れ
  3. (単一バイトが「バッファ」としての資格を得る)バッファ内のビットを蓄積
  4. バッファがいっぱいになったら、ファイルに追加してください。
0

私はこのようにして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);             
     }   
    } 
関連する問題