替换BitArray c#中的位
本文关键字:BitArray 替换 | 更新日期: 2023-09-27 17:58:24
我正在使用它将文件转换为BitArray:
public static byte[] GetBinaryFile(string filename)
{
byte[] bytes;
using (FileStream file = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
}
return bytes;
}
var x=GetBinaryFile(@"path");
BitArray bits = new BitArray(x);
如何替换BitArray中的Bit模式?
您可以使用Set方法在BitArray中设置特殊位。
bits.Set(index, value);
值是一个bool,它将在您的位数组中转换为0和1
即:要将第10位设置为1,请使用
bits.Set(9, true);
下面的代码应该可以工作,使用基本的两步算法来查找匹配位置,然后进行替换。
请注意,对于10MB的文件,在我那台半像样的笔记本电脑上大约需要10秒。如果你想让它更快,你可以使用字节数组和掩码来实现它,而不是笨重且功能不太强大的BitArray抽象。
更好的是,你可以使用不安全的代码,在那里你可以使用指针和更快的复制。。。但由于这是一个C#问题,并且您已经在使用BitArray抽象,我想我会向您展示如何按原样实现它
private static BitArray Replace(BitArray input, BitArray pattern, BitArray replacement)
{
var replacementPositions = GetReplacementPositions(input, pattern);
return PerformReplacements(input, pattern.Length, replacement, replacementPositions);
}
private static List<int> GetReplacementPositions(BitArray input, BitArray pattern)
{
if (pattern.Length == 0) throw new Exception("Pattern cannot have 0 length");
var matchIndicies = new List<int>();
var maxCheckIndex = input.Length - pattern.Length;
var i = 0;
while (i <= maxCheckIndex)
{
if (MatchesAt(input, pattern, i))
{
matchIndicies.Add(i);
i += pattern.Length;
continue;
}
i++;
}
return matchIndicies;
}
private static bool MatchesAt(BitArray input, BitArray pattern, int index)
{
for (var j = 0; j < pattern.Length; j++)
{
if (input[index + j] != pattern[j]) return false;
}
return true;
}
private static BitArray PerformReplacements(BitArray input, int patternLength, BitArray replacement, List<int> replacementPositions)
{
var outLength = input.Length + replacementPositions.Count * (replacement.Length - patternLength);
var output = new BitArray(outLength);
var currentReadIndex = 0;
var currentWriteIndex = 0;
foreach (var matchPosition in replacementPositions)
{
var inputSubstringLength = matchPosition - currentReadIndex;
CopyFromTo(input, output, currentReadIndex, inputSubstringLength, currentWriteIndex);
currentReadIndex = matchPosition + patternLength;
currentWriteIndex += inputSubstringLength;
CopyFromTo(replacement, output, 0, replacement.Length, currentWriteIndex);
currentWriteIndex += replacement.Length;
}
CopyFromTo(input, output, currentReadIndex, input.Length - currentReadIndex, currentWriteIndex);
return output;
}
private static void CopyFromTo(BitArray from, BitArray to, int fromIndex, int fromLength, int toIndex)
{
for (var i = 0; i < fromLength; i++)
{
to.Set(toIndex + i, from.Get(fromIndex + i));
}
}