Frage

Wie Bits schreiben (nicht Bytes) in eine Datei mit c #, .net? Ich preety mit ihm stecken.
Bearbeiten : Ich bin auf der Suche nach einer anderen Art und Weise, die nur alle 8 Bits als ein Byte zu schreiben

War es hilfreich?

Lösung

Die kleinste Menge an Daten, die Sie auf einmal schreiben können, ist ein Byte.

Wenn Sie einzelne Bit-Werte schreiben müssen. (Wie zum Beispiel ein binäres Format, das ein 1-Bit-Flag benötigt, eine 3-Bit-Ganzzahl und eine 4-Bit-Ganzzahl); Sie müssten die einzelnen Werte in den Pufferspeicher und in die Datei schreiben, wenn Sie ein ganzes Byte zu schreiben. (Für Leistung, macht es Sinn, mehr zu puffern und schreiben größere Brocken in die Datei).

Andere Tipps

  1. Accumulate die Bits in einem Puffer (ein einzelnes Byte als "Puffer" qualifizieren)
  2. Wenn ein Bit hinzuzufügen, wobei der Puffer ein Schieben nach links und das neue Bit in der untersten Position gesetzt Verwendung OR
  3. Sobald der Puffer voll ist, fügen Sie ihn in die Datei

Du musst bitshifts oder binäre Arithmetik verwenden, da Sie nur ein Byte zu einem Zeitpunkt, schreiben, nicht einzelne Bits.

Ich habe so etwas wie dies macht eine BitsWriter zu emulieren.

    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);                                                
        }           
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top