题
如何使用 c#、.net 将位(而不是字节)写入文件?我很坚持它。
编辑: :我正在寻找一种不同的方法,将每 8 位写为一个字节
解决方案
可以在同一时间将数据写入的最小量是一个字节。
如果你需要编写单独的比特值。 (例如像一个二进制格式,需要一个1个比特的标志,一个3位的整数和一个4位的整数);你需要缓冲单个值在内存中,当你有一个完整的字节写入写入文件。 (出于性能,是有意义的缓冲更多和写入较大的块到该文件)。
其他提示
- 累积缓冲区中的位(单个字节可以称为“缓冲区”)
- 添加位时,左移缓冲区并使用 OR 将新位放在最低位置
- 缓冲区满后,将其追加到文件中
您将不得不使用bitshifts或二进制算术,你可以一次只写一个字节,而不是单个位。
我做了这样的事情来模拟BitsWriter。
private BitArray bitBuffer = new BitArray(new byte[65536]);
private int bitCount = 0;
// Write one int. In my code, this is a byte
public void write(int b)
{
BitArray bA = new BitArray((byte)b);
int[] pattern = new int[8];
writeBitArray(bA);
}
// Write one bit. In my code, this is a binary value, and the amount of times
public void write(int b, int len)
{
int[] pattern = new int[len];
BitArray bA = new BitArray(len);
for (int i = 0; i < len; i++)
{
bA.Set(i, (b == 1));
}
writeBitArray(bA);
}
private void writeBitArray(BitArray bA)
{
for (int i = 0; i < bA.Length; i++)
{
bitBuffer.Set(bitCount + i, bA[i]);
bitCount++;
}
if (bitCount % 8 == 0)
{
BitArray bitBufferWithLength = new BitArray(new byte[bitCount / 8]);
byte[] res = new byte[bitBuffer.Count / 8];
for (int i = 0; i < bitCount; i++)
{
bitBufferWithLength.Set(i, (bitBuffer[i]));
}
bitBuffer.CopyTo(res, 0);
bitCount = 0;
base.BaseStream.Write(res, 0, res.Length);
}
}
不隶属于 StackOverflow