我已经阅读了其他关于BitArray转换的文章,并亲自尝试了几个,但似乎没有一个能达到我想要的结果。
我的情况是这样的,我有一些c#代码来控制发光二极管条带。要向条带发出一条命令,我最多需要28位
1位,用于在2个led条之间进行选择
6个位置(最多48个可寻址leds)
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#中有没有一种简单的方法来压缩这个比特?
发布于 2013-11-28 00:14:12
嗯,你可以使用BitArray.CopyTo
byte[] bytes = new byte[4];
ba.CopyTo(bytes, 0);或者:
int[] ints = new int[1];
ba.CopyTo(ints, 0);不清楚您希望字符串表示是什么-您正在处理的是自然的二进制数据而不是文本数据……
发布于 2013-11-28 00:38:11
我不会为此使用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);我不明白你为什么要把它作为字符串发送。
https://stackoverflow.com/questions/20247461
复制相似问题