2013-11-27 7 views
1

BitArray 변환에 대한 다른 게시물을 읽었으며 여러 가지를 시도했지만 원하는 결과를 제공하지 못했습니다.BitArray를 작은 바이트 배열로 변환합니다.

내 상황이 그렇듯이 LED 스트립을 제어하는 ​​일부 C# 코드가 있습니다. (2 색 X3 용 스트립 포지션

6 (최대 48 드레서의 LED)를

7지도 사이 I가 선택하는 대부분의 28 비트로

1 비트를 필요로하는 스트립 0- 하나의 명령을 실행하려면 127 value for color)

그 구조체에 대한 BitArray를 만들고 예를 들어 세미 배열을 반값식으로 채 웁니다.

 BitArray ba = new BitArray(28); 

     for(int i = 0 ;i < 28; i++) 
     { 
      if (i % 3 == 0) 
       ba.Set(i, true); 
      else 
       ba.Set(i, false); 
     } 

은 지금은 4 바이트 (마지막 4 비트가 정지 신호를 할 수 있습니다)에 그 28 비트 스틱, 그리고 마지막으로 나는 LED 스트립에 USB를 통해 문자열을 보낼 수 있도록 문자열로 돌려 싶다.

내가 시도한 모든 방법은 각 1과 0을 목표가 아닌 리터럴 char로 변환합니다.

C#에서이 비트 압축을 수행하는 간단한 방법이 있습니까?

byte[] bytes = new byte[4]; 
ba.CopyTo(bytes, 0); 

또는 :

답변

3

그럼 당신은 BitArray.CopyTo 사용할 수

int[] ints = new int[1]; 
ba.CopyTo(ints, 0); 

그것은 분명하지 않다 당신이 문자열 표현이 비록 수 싶어 무엇을 - 당신은 자연적으로 진 상대하고 데이터보다는 텍스트 데이터 ...

+0

감사합니다. 나는 실제로 문자열 표현에 관심이 없다. 현재 사용하는 시스템은 문자열 인코딩을 사용하여 통신하지만 17 바이트를 보내면 동일한 정보가 전달됩니다. LibUsbDotNet의 send 메소드가 요청하기 때문에 문자열로만 변환합니다. 이번 주말에 제공 한 솔루션으로 작업하여 전송을 최적화 할 수 있는지 알아 보겠습니다. – RGroppa

1

나는 이것을 위해 BitArray을 사용하지 않을 것입니다. 대신,이 구조체를 사용하는 것, 그리고 내가해야 할 때 다음의 int로 그 팩 :

var blue17 = new Led(true, 17, 0, 0, 127); 
var blah22 = new Led(false, 22, 15, 97, 42); 
: 당신이 비트 배열 바이올린 필요없이 쉽게 구조를 만들 수 있습니다

struct Led 
{ 
    public readonly bool Strip; 
    public readonly byte Position; 
    public readonly byte Red; 
    public readonly byte Green; 
    public readonly byte Blue; 

    public Led(bool strip, byte pos, byte r, byte g, byte b) 
    { 
     // set private fields 
    } 

    public int ToInt() 
    { 
     const int StripBit = 0x01000000; 
     const int PositionMask = 0x3F; // 6 bits 
     // bits 21 through 26 
     const int PositionShift = 20; 
     const int ColorMask = 0x7F; 
     const int RedShift = 14; 
     const int GreenShift = 7; 

     int val = Strip ? 0 : StripBit; 
     val = val | ((Position & PositionMask) << PositionShift); 
     val = val | ((Red & ColorMask) << RedShift); 
     val = val | (Blue & ColorMask); 
     return val; 
    } 
} 

그 방법

얻을 수있는 값 : 당신은 BitConverter 쉽게 충분한 바이트 배열로 INT를 설정할 수 있습니다

int blue17_value = blue17.ToInt(); 

:

var blue17_bytes = BitConverter.GetBytes(blue17_value); 

문자열로 전송하려는 이유가 불분명합니다.

관련 문제