2009-08-22 12 views
6

¿Cómo puedo escribir bits en una secuencia (System.IO.Stream) o leer en C#? Gracias.¿Cómo escribir/leer bits desde/hacia un flujo? (C#)

+0

¿Puede dar un poco más de contexto? ¿Quiere decir leer/escribir datos binarios en lugar de datos de texto? ¿Qué tipo de datos es lo que intentas leer/escribir? –

+0

¿Realmente quieres escribir bits individuales (no bytes)? –

+2

La pregunta es clara como el cristal, que necesita escribir o leer un bit a la vez desde/hacia una secuencia. Esto es típico para escribir secuencias compactas o compresión Huffman. –

Respuesta

11

podría crear un método de extensión de corriente que enumera los bits, así:

public static class StreamExtensions 
{ 
    public static IEnumerable<bool> ReadBits(this Stream input) 
    { 
     if (input == null) throw new ArgumentNullException("input"); 
     if (!input.CanRead) throw new ArgumentException("Cannot read from input", "input"); 
     return ReadBitsCore(input); 
    } 

    private static IEnumerable<bool> ReadBitsCore(Stream input) 
    { 
     int readByte; 
     while((readByte = input.ReadByte()) >= 0) 
     { 
      for(int i = 7; i >= 0; i--) 
       yield return ((readByte >> i) & 1) == 1; 
     } 
    } 
} 

El uso de este método de extensión es fácil:

foreach(bool bit in stream.ReadBits()) 
{ 
    // do something with the bit 
} 
+1

Limpio usando métodos de extensión. Sin embargo, puede agregar soporte para leer bits en orden opuesto. –

3

Esto no es posible con la clase de transmisión predeterminada. La clase de flujo C# (BCL) opera en la granularidad de bytes en su nivel más bajo. Lo que puede hacer es escribir una clase contenedora que lea bytes y particione en bits.

Por ejemplo:

class BitStream : IDisposable { 
    private Stream m__stream; 
    private byte? m_current; 
    private int m_index; 
    public byte ReadNextBit() { 
    if (!m_current.HasValue) { 
     m_current = ReadNextByte(); 
     m_index = 0; 
    } 
    var value = (m_byte.Value >> m_index) & 0x1; 
    m_index++; 
    if (m_index == 8) { 
     m_current = null; 
    } 
    return value; 
    } 
    private byte ReadNextByte() { 
    ... 
    } 
    // Dispose implementation omitted 
} 

Nota: Esto leer los bits derecho a la moda izquierda, que pueden o no ser lo que usted está con la intención.

+0

¿Hay una biblioteca para eso? –

+0

@Alon, acabo de agregar una muestra rápida sobre cómo hacer eso – JaredPar

+0

¿Puede agregar un ejemplo para escribir bits, por favor? –