C# 基于文件填充一组复选框

C# 基于文件填充一组复选框,c#,.net,winforms,binary,bitarray,C#,.net,Winforms,Binary,Bitarray,我试图弄清楚如何使用二进制读取器读取文件(不是由我的程序创建的),并相应地选中或取消选中一组复选框 我已设法确定复选框的存储方式如下: Checkbox 1 = 00 01 Checkbox 2 = 00 02 Checkbox 3 = 00 04 Checkbox 4 = 00 08 Checkbox 5 = 00 10 Checkbox 6 = 00 20 Checkbox 7 = 00 40 Checkbox 8 = 00 60 Checkbox 9 = 00 80 Checkbox 10

我试图弄清楚如何使用
二进制读取器
读取文件(不是由我的程序创建的),并相应地选中或取消选中一组复选框

我已设法确定复选框的存储方式如下:

Checkbox 1 = 00 01
Checkbox 2 = 00 02
Checkbox 3 = 00 04
Checkbox 4 = 00 08
Checkbox 5 = 00 10
Checkbox 6 = 00 20
Checkbox 7 = 00 40
Checkbox 8 = 00 60
Checkbox 9 = 00 80
Checkbox 10 = 01 00
Checkbox 11 = 02 00
etc

因此,如果在文件中选中复选框1、2、6和10,十六进制值将为:01 23。我如何将其分解,以便选中程序中的正确复选框

保留一个带有
复选框的
复选框[]
列表
,并按正确顺序引用
复选框
,以便您可以按索引引用它们。您可以循环遍历各个位值,并使用计数器跟踪与该位关联的索引:

short setBits = 0x0123; # short because it is 2 bytes.
short currentBit = 0x0001;
// loop through the indexes (assuming 16 CheckBoxes or fewer)
for (int index = 0; index < checkBoxes.Length; index++) {
    checkBoxes[index].Checked = (setBits & currentBit) == currentBit;
    currentBit <<= 1; // shift one bit left;
}
short-setBits=0x0123;#短,因为它是2个字节。
短电流位=0x0001;
//循环遍历索引(假设16个复选框或更少)
for(int index=0;indexcurrentBit这就足够了-适当调整上限

for(int i = 0; i < 15; ++i) {
    Checkbox[i + 1].Checked = (yourbits && (1 << i)) != 0
}
for(int i=0;i<15;++i){

复选框[i+1]。Checked=(你的位&&&(1我认为你的例子中有一个输入错误。复选框8不应该是0060,而是0080。所以123表示位:1、2、6、9(不是10)

像这样:

Checkbox 01 = 00 01
Checkbox 02 = 00 02
Checkbox 03 = 00 04
Checkbox 04 = 00 08
Checkbox 05 = 00 10
Checkbox 06 = 00 20
Checkbox 07 = 00 40
Checkbox 08 = 00 80
Checkbox 09 = 01 00
Checkbox 10 = 02 00
要选中设置的复选框,可以使用如下代码:

// var intMask = Convert.ToInt32("0123", 16); // use this line if your input is string
var intMask = 0x0123";
var bitArray = new BitArray(new[] { intMask });
for (var i = 0; i < 16; i++)
{
    var isCheckBoxSet = bitArray.Get(i);
    if (isCheckBoxSet)
        Console.WriteLine("Checkbox {0} is set", i + 1);
}
因此,带有复选框的代码将如下所示:

var checkboxes = new List<CheckBox>();
var intMask = 0x0123;
var bitArray = new BitArray(new[] { intMask });
for (var i = 0; i < 16; i++)
    checkboxes.Add(new CheckBox { Checked = bitArray.Get(i) });
var复选框=新列表();
var intMask=0x0123;
var bitArray=新的位数组(新[]{intMask});
对于(变量i=0;i<16;i++)
添加(新复选框{Checked=bitArray.Get(i)});

+1用于
位数组
。我一定对位旋转感到太舒服了。我宁愿自己使用
位数组
,这取决于还有谁可能在维护代码。
var checkboxes = new List<CheckBox>();
var intMask = 0x0123;
var bitArray = new BitArray(new[] { intMask });
for (var i = 0; i < 16; i++)
    checkboxes.Add(new CheckBox { Checked = bitArray.Get(i) });