2013-12-12 4 views
0
byte[] sample = new byte[]{10,20,30}; 

-THE 값은 6 비트이고, (오른쪽에서 왼쪽으로) 제 3 비트에서 시작바이트 배열에서 특정 위치의 비트 값을 가져 오는 방법은 무엇입니까?

새로운 바이트 [] {10,20,30}를 "00001010 00010100 00011110는"(같은 순서이어야 같다 이 그래서 "00001010 00010100 * 000,111 * 10" - 내 값은 Yaur) 움 (답 1에 기초하여 상기 용액 7

이다 필요) 순서 바이트 단지 방향

public static bool GetValue(byte[] data, int position) 
     { 
      var bytePos = data.Length - 1 - position/8;//right -> left 
      //var bytePos = position/8;//left -> right 
      var bitPos = position % 8; 

      return ((data[bytePos] & (1 << bitPos)) != 0);//right -> left 
      //return ((data[bytePos] & (1 << (7 - bitPos))) != 0); //left -> right 
     } 

     public static long GetValue(byte[] data, int position, int length) 
     { 
      if (length > 62) 
      { 
       throw new ArgumentException("not going to work properly with 63 bits if the first bit is 1"); 
      } 
      long retv = 0; 
      for (int i = position + length - 1; i > position - 1; i--) 
      //for(int i = position;i<position+length;i++)//left -> right 
      { 
       if (GetValue(data, i)) retv |= 1; 
       retv = retv << 1; 
      } 
      retv = retv >> 1; 
      return retv; 
     } 
변경된 비트
+1

을 나는 당신의 질문은 매우 분명하다 생각하지 않습니다. 이 부분에서 의미하는 것을 더 설명 할 수 있습니까? "새 바이트 [] {10,20,30}은"1010 10100 11110 "이고 필요합니까 ..."? –

+0

BitArray에는'.Copy (byte []) '함수가 없습니다. 그게'CopyTo'인가, 아니면 확장 메소드인가? –

+0

바이트 인덱스를 찾으려면 8으로 나눕니다. 나머지는 해당 바이트 내의 비트 인덱스입니다. –

답변

3

이것은 대부분의 입력에 대해 작동합니다 :

public bool GetValue(byte[] data, int position) 
{ 
    var bytePos = position/8; 
    var bitPos = position % 8; 
    return ((data[bytePos] & (1 << bitPos))!=0) 
    // depending on the order in which you expect the bits you might need this instead 
    //return ((data[bytePos] & (1 << (7-bitPos)))!=0) 

} 

public long GetValue(byte[] data, int position, int length) 
{ 
    if(length > 62) 
    { 
     throw new ArgumentException("not going to work properly with 63 bits if the first bit is 1"); 
    } 
    long retv=0; 
    for(int i = position;i<position+length;i++) 
    { 
     if(GetValue(data,i) 
     { 
      retv |=1; 
     } 
     retv = retv << 1; 
    } 
    retv = retv >> 1; 
} 
+0

"retv = retv << 1"및 "return retv = retv"를 의미합니까? 1; "? ... 나는 이것을 시험해 보았지만 뭔가 잘못된 것처럼 보였다. 아마도 문제는 값을 완성하기 전에 비트를 뒤집을 때 일까? – Fox

+0

이 정확한지 확인하기 위해 답변에서 수정하고 고위 순서에서 하위 순서로 비트를 가져 오는 코드를 추가했습니다. – Yaur

+0

여전히 값 7을 얻을 수 없다 : 어떤 경우 든 문제가있다. (실제로 나는 당신의 코드가하는 일을 이해하고 있는지 확신하지 못한다 : ( – Fox