如何从/向流写入/读取位? (C#)

时间:2009-08-22 12:02:56

标签: c#

如何将位写入流(System.IO.Stream)或读取C#?感谢。

2 个答案:

答案 0 :(得分:12)

您可以在Stream上创建一个枚举位的扩展方法,如下所示:

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

使用此扩展方法很简单:

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

答案 1 :(得分:4)

默认流类无法做到这一点。 C#(BCL)Stream类在其最低级别的字节粒度上运行。你可以做的是写一个包装类,它读取字节并将它们分配到位。

例如:

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
}

注意:这将读取从右到左方式的位,这可能是也可能不是您想要的。