Vra

Hoe om stukkies (nie grepe) om 'n lêer met c # skryf, net? Ek is preety vas met dit.
Edit : Ek is op soek na 'n ander manier wat net skryf elke 8 stukkies as 'n byte

Was dit nuttig?

Oplossing

Die kleinste hoeveelheid data wat jy op 'n tyd kan skryf is 'n byte.

As jy nodig het om individuele bietjie-waardes te skryf. (Soos byvoorbeeld 'n binêre formaat wat 'n 1 bietjie vlag vereis, 'n 3 bis integriteit en 'n 4 bis integriteit); jy nodig sou wees om die individuele waardes buffer in die geheue en skryf na die lêer wanneer jy 'n hele byte te skryf. (Vir prestasie, is dit sinvol om meer te buffer en skryf groter stukke om die lêer).

Ander wenke

  1. versamel die stukkies in 'n buffer ( 'n enkele byte kan kwalifiseer as 'n "buffer")
  2. Wanneer die toevoeging van 'n bietjie, links-skuif die buffer en sit die nuwe bietjie in die laagste posisie met behulp van OR
  3. Sodra die buffer is vol, voeg dit by die lêer

Jy sal hê om te bitshifts of binêre rekenkundige gebruik, as jy net een byte kan skryf op 'n tyd, nie individuele stukkies.

Ek het iets gemaak soos hierdie na 'n BitsWriter navolg.

    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);                                                
        }           
    }
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top