首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将BitArray转换为小字节数组

将BitArray转换为小字节数组
EN

Stack Overflow用户
提问于 2013-11-28 00:11:51
回答 2查看 2.1K关注 0票数 1

我已经阅读了其他关于BitArray转换的文章,并亲自尝试了几个,但似乎没有一个能达到我想要的结果。

我的情况是这样的,我有一些c#代码来控制发光二极管条带。要向条带发出一条命令,我最多需要28位

1位,用于在2个led条之间进行选择

6个位置(最多48个可寻址leds)

7表示颜色x3 (0-127值表示颜色)

假设我为该结构创建了一个BitArray,作为示例,我们半随机地填充它。

代码语言:javascript
运行
复制
        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#中有没有一种简单的方法来压缩这个比特?

EN

回答 2

Stack Overflow用户

发布于 2013-11-28 00:14:12

嗯,你可以使用BitArray.CopyTo

代码语言:javascript
运行
复制
byte[] bytes = new byte[4];
ba.CopyTo(bytes, 0);

或者:

代码语言:javascript
运行
复制
int[] ints = new int[1];
ba.CopyTo(ints, 0);

不清楚您希望字符串表示是什么-您正在处理的是自然的二进制数据而不是文本数据……

票数 3
EN

Stack Overflow用户

发布于 2013-11-28 00:38:11

我不会为此使用BitArray。相反,我会使用一个结构,然后在需要时将其打包到一个int中:

代码语言:javascript
运行
复制
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;
    }
}

这样,您可以轻松地创建您的结构,而不必摆弄位数组:

代码语言:javascript
运行
复制
var blue17 = new Led(true, 17, 0, 0, 127);
var blah22 = new Led(false, 22, 15, 97, 42);

并获取这些值:

代码语言:javascript
运行
复制
int blue17_value = blue17.ToInt();

使用BitConverter可以很容易地将int转换为字节数组

代码语言:javascript
运行
复制
var blue17_bytes = BitConverter.GetBytes(blue17_value);

我不明白你为什么要把它作为字符串发送。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20247461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档