2014-03-28 3 views
0

이미 비트 배열 길이가 8의 배수 일 때만 작동하는 비트 프로그램이 작성되었습니다. 5 비트의 비트 배열을 바이트로 변환하는 데 도움이 될 수 있습니까?비트 배열을 5 비트 또는 6 비트 만 사용하는 경우 비트 배열을 바이트로 변환하는 방법

두 함수는 비트 배열이 8의 배수 일 때만 작동합니다.

public static byte[] BitArrayToByteArray(BitArray bits) 
     { 
      byte[] ret = new byte[bits.Length/8]; 
      bits.CopyTo(ret, 0); 
      return ret; 
     } 


public static byte[] ToByteArray(this BitArray bits) 
     { 
      int numBytes = bits.Count/8; 
      if (bits.Count % 8 != 0) numBytes++; 

      byte[] bytes = new byte[numBytes]; 
      int byteIndex = 0, bitIndex = 0; 

      for (int i = 0; i < bits.Count; i++) 
      { 
       if (bits[i]) 
        bytes[byteIndex] |= (byte)(1 << (7 - bitIndex)); 

       bitIndex++; 
       if (bitIndex == 8) 
       { 
        bitIndex = 0; 
        byteIndex++; 
       } 
      } 
      return bytes; 
     } 
+0

알아 두어야 할 사항 : 배열의 첫 번째 바이트는 비트 0-7을 나타내며 두 ​​번째 바이트는 비트 8-15를 나타내는 식입니다. "bytes [0] & 1"은 비트 0을 나타내고 "bytes [0] & 2"는 비트 1을 나타내며 "bytes [0] & 4"는 비트 2를 나타내며 각 바이트의 최하위 비트는 가장 낮은 인덱스 값을 나타냅니다. 곧. (from : http://msdn.microsoft.com/en-us/library/x1xda43a.aspx) – qqbenq

답변

1

은 기본적으로 당신이 당신의 첫 번째 방법에서 필요한 바이트 수를 반올림해야합니다

byte[] ret = new byte[(bits.Length + 7)/8]; 
bits.CopyTo(ret, 0); 

두 번째 방법은 이미 첫 눈에 좋아 보이는을 ... 확실히 바이트의 오른쪽 숫자를 채워 . 당신이 원하는 방식으로 그들을 채울 수는 없지만, 그 경우 당신은 그것이 어떻게 채워지는지에 대한 더 자세한 정보를 제공해야합니다. 예를 들어 bitIndex의 초기 값을 변경하는 것이 좋습니다. (샘플 입력 및 출력은 매우 유용 할 것입니다.)

+1

적절한 캐스팅으로'Math.Ceiling (bits.Length/8d)'가 동일 할 것이라고 생각합니다. (IMO가 더 명확합니다. 의도, 캐스팅 제외) –

+0

@TimS : 가능합니다. - 내가 세부적인 것을 생각할 필요가 없기 때문에, 내가하는 경향이 있습니다. 물론 이것을 정기적으로 수행하는 경우 확장 메서드로 추출하기가 쉽습니다. –

+0

@TimS .: 2 진 또는 10 진수, 부동 소수점으로의 변환이 비싸고 부동 소수점 분할도 마찬가지입니다. 이런 사소한 작업을 위해서'ceil()'을 사용할 수있는 모든 작업을 수행하면 ... 잔인합니다. 정수 부분은 의도 ('bettin, IMHO) : bits.Length/8 + (bits.Length % 8? 1 : 0)'도 표시합니다. 여기 잠재 고객이 조금 열중하고있어 2의 거듭 제곱을 다루므로 부서 운영을 완전히 피하십시오. 잠재 고객의 언어를 말하고 필요한 바이트 수까지 비트 회전하십시오 : bits.Length >> 3 + ((bits.Length & 7) == 0? 0 : 1)'. –