Заполнение набора флажков на основе файла - PullRequest
2 голосов
/ 05 июня 2011

Я пытаюсь выяснить, как читать файл (не созданный моей программой), используя BinaryReader и, соответственно, отмечать или снимать флажки.

Мне удалось выяснить, что флажки хранятся так:

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. Как бы я разбил это так, чтобы были установлены правильные флажки в программе?

Ответы [ 3 ]

2 голосов
/ 05 июня 2011

Я думаю, что в вашем примере есть опечатка. Флажок 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);
}

Выход:

Checkbox 1 is set
Checkbox 2 is set
Checkbox 6 is set
Checkbox 9 is set

Таким образом, ваш код с флажками будет таким простым:

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) });
2 голосов
/ 05 июня 2011

Сохраняйте CheckBox[] или List<CheckBox> со ссылками CheckBox в правильном порядке, чтобы вы могли ссылаться на них по индексу.Вы должны пройтись по отдельным значениям битов и использовать счетчик для отслеживания индекса, связанного с этим битом:

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;
}
0 голосов
/ 05 июня 2011

Это будет достаточно - отрегулируйте верхний предел соответствующим образом.

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