如何将位写入流(System.IO.Stream)或读取C#?感谢。
答案 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
}
注意:这将读取从右到左方式的位,这可能是也可能不是您想要的。