2013-11-27 53 views
1

我已阅读BitArray转换中的其他帖子,并尝试了几次,但似乎没有提供我想要的结果。将BitArray转换为小字节数组

我的情况是这样的,我有一些控制LED灯条的c#代码。要发出一个命令到我需要至多28位

1位用于选择2之间导致条

6位置(最大48可寻址的LED)

7为彩色X3带材(0- 127值为颜色)

假设我为该结构创建了一个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位,最后把它变成一个字符串,所以我可以通过USB发送字符串至LED带。

我试过的所有方法都将每个1和0转换为不是目标的文字字符。

有没有一种简单的方法可以在C#中实现这一点压缩?

回答

3

那么你可以使用BitArray.CopyTo

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

或者:

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

目前尚不清楚你想要的字符串表示是什么,虽然 - 你处理自然二进制数据而不是文本数据...

+0

谢谢乔恩。我实际上并不关心字符串表示。我使用的当前系统使用字符串编码进行通信,但最终发送了17个字节来传递相同的信息。我只将它转换为字符串是因为LibUsbDotNet的send方法请求它。我将与本周末提供的解决方案一起工作,看看我是否可以优化传输。 – RGroppa

1

我不会使用这个BitArray。相反,我会使用一个结构,然后打包到这一个int,当我需要:

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; 
    } 
} 

这样,你可以轻松地创建您的结构,而不必与比特串拨弄:

var blue17 = new Led(true, 17, 0, 0, 127); 
var blah22 = new Led(false, 22, 15, 97, 42); 

并获取值:

int blue17_value = blue17.ToInt(); 

您可以BitConverter转INT到字节数组足够容易:

var blue17_bytes = BitConverter.GetBytes(blue17_value); 

我不清楚你为什么要发送它作为一个字符串。