我已经阅读过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#中进行这种压缩?
答案 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
var blue17_bytes = BitConverter.GetBytes(blue17_value);
我不清楚为什么要将其作为字符串发送。