4

c#、.netでファイルにビット(バイトではなく)を書き込む方法は? 私はそれにかなりこだわっています。
編集:8ビットごとに1バイトとして書き込む別の方法を探しています

4

4 に答える 4

6

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

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

于 2009-03-15T22:17:15.203 に答える
5
  1. バッファにビットを蓄積します(1バイトは「バッファ」と見なすことができます)
  2. ビットを追加するときは、バッファを左シフトし、ORを使用して新しいビットを最下位に配置します
  3. バッファがいっぱいになったら、ファイルに追加します
于 2009-03-15T22:18:53.280 に答える
1

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);                                                
        }           
    }
于 2013-08-13T20:08:10.570 に答える
0

個々のビットではなく、一度に 1 バイトしか書き込むことができないため、ビットシフトまたはバイナリ演算を使用する必要があります。

于 2009-03-15T22:16:16.640 に答える