将BitArray转换为小字节数组

时间:2013-11-27 16:11:51

标签: c# bit-manipulation

我已经阅读过BitArray转换的其他帖子并自己尝试了几个,但似乎没有人提供我想要的结果。

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

1位用于在2个LED灯条之间进行选择

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

现在我想将这28位保留在4个字节中(最后4位可以是停止信号),最后将其转换为字符串,这样我就可以通过USB将字符串发送到LED灯条。

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

有没有直接的方法在C#中进行这种压缩?

2 个答案:

答案 0 :(得分:3)

你可以使用BitArray.CopyTo

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

或者:

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

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

答案 1 :(得分: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);

我不清楚为什么要将其作为字符串发送。