我正试图使用CodeProject.com上的Bill Koukoutsis的BitStream库将一块数据从8位打包转换为7位打包,该库似乎仍然是C#中这类东西的首选来源。我使用的代码如下(fs是在代码外初始化的文件流):
for (int block = 0; block < count; block++)
{
var theBlock = fetcher(block);
if (theBlock.Any(x => (x != 0)))
{
Console.Write("Good Block =>");
}
else
{
Console.Write("Zero block =>");
}
var sevenBitSize = theBlock.Length - (theBlock.Length/8);
var theCodedBlock = new byte[sevenBitSize];
var ms = new MemoryStream(theCodedBlock);
BitStream bms = ms;
using (bms)
{
foreach (byte t in theBlock)
{
bms.Write(t, 0, 7);
}
bms.WriteTo(fs);
}
if (theCodedBlock.Any(x => (x != 0)))
{
Console.Write("Good Blockn");
}
else
{
Console.Write("Zero blockn");
}
}
运行时,这会产生一个恒定的"Good Block=>Zero Block"流。因此,由于某种原因,BitStream正在将零输出到CodeBlock数组中。它似乎可以从代码中其他地方的内存数组中读取值,所以我是做错了什么,还是这是BitStream错误?
刚刚发现问题:
BitStream
库不正确地支持写入它加载的流;它写入内部缓冲区,但不执行任何操作将其写回到流中。您必须创建一个空的BitStream
,写入其中,然后将其转换回MemoryStream
。