2016-07-23 1 views
1

c를 BitArray의 비트를 교체 :나는 이것이 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의 비트의 패턴을 바꿀 수 있습니까?

+0

예를 들려 줄 수 있습니까? –

+0

내가이 패턴을 가지고 있다고 가정 해 봅시다 : '010101'과'X'로 바꾸고 싶습니다. – Ben

+0

이 패턴을 배열에 나타나는 모든 위치로 대체 하시겠습니까? –

답변

0

Set 메서드를 사용하여 BitArray에 특수 비트를 설정할 수 있습니다.

bits.Set(index, value); 

값은 bitarray

즉 0과 1로 변환합니다 부울입니다 : 1 개 사용 아래의 코드가 작동해야

bits.Set(9, true); 
+0

@DavidE 죄송합니다. 귀하가 무엇을 요구하고 있는지 이해할 수 없습니다. replace 메소드를 사용하여 작성하지 않았습니다. 집합 메소드는 2 개의 입력을 가지며, 첫 번째는 비트 배열의 인덱스입니다. 10 번째 비트를 1로 변경하려면 비트를 써야합니다. (9, true); –

0

에 10 비트를 설정하기 위해 사용 일치하는 위치를 찾고 대체 할 기본 2 패스 알고리즘

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)); 
     } 
    } 
+0

@Ben BitArray를 byte []로 만듭니다. 그래서 당신은 필요 없다 :'BitArray value = 새로운 BitArray (new [] {xh})'? –

관련 문제