2017-11-14 7 views
0

바이트 배열로 .pst (File Structure) 파일을 읽는 중입니다. 이제 데이터를 짝수와 홀수의 두 부분으로 나누고 싶습니다. 짝수 용과 홀수 용으로 2 개의 다른 파일에 저장하십시오. 아래는 제가 사항 Array.length를 시도 FOR 루프에서바이트 배열을 짝수 바이트 배열과 홀수 바이트 배열로 나누고 파일에 저장합니다.

 byte[] array = File.ReadAllBytes("PST_Sample.pst"); 
     for (int index = 0; index < even.Length; index++) 
     { 

      //Console.WriteLine(index + " : " + array[index]); 
      if ((array[index] % 2) == 0) 
      { 
       even[index] = array[index]; 
      } 
      else 
      { 
       odd[index] = array[index]; 
      } 
     } 

에 붙어하고있는 코드가, even.length 아무것도 작동하지 않습니다.

+0

: 여기

는 당신이 그 결함을 방지하기 위해 코드를 위해 할 수있는 방법입니다. 하나는 전체 배열에, 하나는 짝수/홀수 배열에있는 곳을 추적하는 데 사용됩니다. for 루프가 array.length로 이동하기를 원할 것이다. –

+0

컨테이너가 반드시 배열이 필요합니까? 그렇지 않은 경우 목록을 대신 사용해보십시오. 그렇게하면 간단히 새 목록을 생성 한 다음 각 값을 추가 할 수 있습니다. – Sirmyself

+0

@Blake Thingstad 방금 문제가 해결되었습니다. 어쨌든 고마워. –

답변

0

과 반드시 ​​코드를 수정하는 방법을, 다음, 가장 쉬운 방법은 LINQ를 사용하는 것입니다
대신 다음 코드를 사용해보십시오. 당신이 byte[]을 할 evenodd 필요한 경우

byte[] array = new byte[] 
{ 
    55, 56, 57, 58, 89, 90, 91, 92 
}; 
var even = array.Where((b, i) => i % 2 == 0); 
var odd = array.Except(even); 

후 바로 각 라인에 .ToArray()을 추가합니다.

이러한 값을 다시 삽입하려면 여기에 확장 메서드가 있어야합니다 (정상적인 메서드 만 사용하려는 경우 staticthis 제외). 하나의 컬렉션이 다른 컬렉션보다 클 때도 인터리브되도록 this 질문을 수락했습니다.

public static IEnumerable<T> Interleave<T>(this IEnumerable<T> first, IEnumerable<T> second) 
{ 
    using (var firstEnumerator = first.GetEnumerator()) 
    using (var secondEnumerator = second.GetEnumerator()) 
    { 
     var firstMoved = firstEnumerator.MoveNext(); 
     var secondMoved = secondEnumerator.MoveNext(); 

     while (firstMoved || secondMoved) 
     { 
      if (firstMoved) 
       yield return firstEnumerator.Current; 
      if (secondMoved) 
       yield return secondEnumerator.Current; 

      firstMoved = firstEnumerator.MoveNext(); 
      secondMoved = secondEnumerator.MoveNext(); 
     } 
    } 
} 
+0

짝수 변수는 필요한 데이터를 저장하지만 홀수 변수 파일은 여전히 ​​비어 있습니다. –

+0

@HamzaShahid 내가 일한다고 생각 하나? –

+0

예. 감사합니다. 한 가지 더, 어떻게 두 파일 데이터를 하나의 파일로 결합 할 수 있습니까? 위의 코드를 참조하십시오. 단일 파일 데이터를 짝수 및 홀수 파일에 저장했습니다. 이제이 데이터를 단일 파일로 다시 복구하려고합니다. 내가 어떻게 할 수 있니? –

0

테스트가 잘못되었습니다. 인덱스가 아닌 데이터의 바이트를 테스트하고 있습니다. 그것은해야한다 :

for (int index = 0; index < array.Length; index++) 
    { 

     //Console.WriteLine(index + " : " + array[index]); 
     if ((index % 2) == 0) 
     { 
      even[index/2] = array[index]; 
     } 
     else 
     { 
      odd[(index - 1)/2] = array[index]; 
     } 
    } 
+1

작동하지 않습니다. 짝수 및 홀수 배열의 길이는 전체 배열의 길이의 절반입니다. 따라서 인덱스가 짝수 또는 홀수의 길이보다 길면 실패합니다. –

+0

예, 물론 - 주요 문제 만 해결했습니다. 내 코드를 수정하겠습니다. –

1

arrayevenodd 배열을 2 배 이상이다. 방금 솔루션을 찾고 있다면

for (int index = 0; index < even.Length; index++) 
{ 
    even[index] = array[index * 2]; 
    odd[index] = array[index * 2 + 1]; 
} 
1

원본 배열의 색인을 2 씩 증가시키고 대상 배열을 1 씩 증가시킵니다. 이렇게하면 짝수/홀수 테스트를 추가하지 않고 한 묶음으로 oddeven 어레이에 바이트를 할당 할 수 있습니다.

for (int src = 0, dst = 0; src < array.Length; src += 2, dst++) 
{ 
    even[dst] = array[src]; 
    odd[dst] = array[src + 1]; 
} 

배열 길이가 홀수 인 경우,이 odd[]even[] 이상의 짧게해야한다. 또한 범위를 벗어나는 인덱스 예외로 실행되지 않도록 특별한주의를 기울여야합니다.

용액 또한 홀수 어레이 길이 작업 루프 내에서 추가 시험을 회피 :

byte[] array = { 0, 1, 2, 3, 4 }; 
bool isOdd = array.Length % 2 == 1; 

byte[] even = new byte[(array.Length + 1)/2]; 
byte[] odd = new byte[array.Length/2]; 

int length = isOdd ? array.Length - 1 : array.Length; 
for (int src = 0, dst = 0; src < length; src += 2, dst++) { 
    even[dst] = array[src]; 
    odd[dst] = array[src + 1]; 
} 

if (isOdd) { // If array length is odd, the last index is even (= length - 1). 
    // Assign the last remaining entry. 
    even[even.Length - 1] = array[array.Length - 1]; 
} 
0

메인 어레이는 두 결과 두 배 길다. 데이터에 따라 코드에 2 ~ 3 개의 설계 오류가있을 수 있습니다.

1 번째 결함은 모든 어레이에 대해 동일한 색인을 동시에 사용한다는 것입니다. 따라서 짝수 배열이나 홀수 배열을 위해 각 패스에서 메모리 셀을 건너 뛰고 한도가 짝수 배열의 크기이기 때문에 기본 배열의 절반 만 이동하면됩니다.

두 번째 결함 데이터에 따라 짝수 및 홀수 배열에 다른 크기가 필요할 수도 있습니다

세 번째 결함 첫 번째 결함과 두 번째 결함을 결합하면 가장 중요한 오류가 발생할 수 있습니다. 25 개의 짝수와 67 개의 홀수가있는 경우 동일한 인덱스를 사용하기 때문에 index >= 25에 도달 할 때까지 코드가 작동합니다. 배열의 마지막 인덱스는 32이므로 마지막 인덱스는 32 이후가됩니다.

배열 수 대신 데이터를 저장할 수 있도록 배열을 사용하는 것이 좋습니다. 당신은이 지수를 필요로하기 위하여려고하고있다

byte[] array = File.ReadAllBytes("PST_Sample.pst"); 
List<byte> even = new List<byte>(); 
List<byte> odd = new List<byte>(); 

for (int index = 0; index < array.Length; index++) 
{ 
    if ((array[index] % 2) == 0) 
    { 
     even.Add(array[index]); 
    } 
    else 
    { 
     odd.Add(array[index]); 
    } 
} 

File.WriteAllBytes("even_file.pst", even.ToArray()); 
File.WriteAllBytes("odd_file.pst", odd.ToArray());