2009-08-22 10 views
6

Comment puis-je écrire des bits dans un flux (System.IO.Stream) ou lire en C#? Merci.Comment écrire/lire des bits de/vers un flux? (C#)

+0

Pouvez-vous fournir un peu plus de contexte? Voulez-vous dire lire/écrire des données binaires par opposition aux données de texte? Quel type de données avez-vous l'intention de lire/écrire? –

+0

Voulez-vous vraiment écrire des bits simples (pas des octets)? –

+2

La question est limpide, qu'il a besoin d'écrire ou de lire un seul bit à la fois vers/depuis un flux. Ceci est typique pour l'écriture de flux compacts ou la compression Huffman. –

Répondre

11

Vous pouvez créer une méthode d'extension sur Stream qui énumère les bits, comme ceci:

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; 
     } 
    } 
} 

En utilisant cette méthode d'extension est facile:

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

Neat en utilisant des méthodes d'extension. Cependant, vous pouvez ajouter un support pour lire les bits dans l'ordre inverse. –

3

Cela n'est pas possible avec la classe de flux par défaut. La classe de flux C# (BCL) fonctionne sur la granularité des octets à son niveau le plus bas. Ce que vous pouvez faire est d'écrire une classe wrapper qui lit les octets et les partage en bits.

Par exemple:

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 
} 

Note: Ceci lit les bits droit à la mode gauche qui peut ou peut ne pas être ce que vous avez l'intention.

+0

Y a-t-il une bibliothèque pour ça? –

+0

@Alon, je viens d'ajouter un exemple rapide sur la façon de le faire – JaredPar

+0

Pouvez-vous ajouter un exemple pour écrire des bits, s'il vous plaît? –

Questions connexes