Преобразовать BitArray в строку одинаковой длины
Я использую алгоритм этого вопроса: Конвертировать List
Но я имею дело с длиной BitArray
когда это наоборот. Я имею в виду, если мой BitArray
длина была 12, когда я переворачиваю ее, мне нужно иметь длину 12, а не 16.
Я могу представить, что мне нужно добавить информацию о числе в строковый результат. Но я не уверен, что это будет правильно. Как я могу получить тот же bitArray с такой же длиной?
Текущий код:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
var values = new BitArray(12);
values[0] = true;
values[1] = true;
values[2] = true;
values[3] = true;
values[4] = true;
values[5] = true;
values[6] = true;
values[7] = true;
values[8] = false;
values[9] = true;
values[10] = true;
values[11] = false;
var bytes = new byte[(values.Length + 7) / 8];
values.CopyTo(bytes, 0);
var result = Convert.ToBase64String(bytes);
var bytes2 = Convert.FromBase64String(result);
var values2 = new BitArray(12);
for (int i = 0; i < values2.Count; i++)
{
var temp = bytes - 1;
}
}
3 ответа
Почему бы просто не сделать:
bool[] vals = new[]{false, true, false, true, false, true};
StringBuilder sb = new StringBuilder();
foreach(var b in vals){
sb.Append(b ? "1" : "0");
}
sb.ToString();
// prints out "010101"
РЕДАКТИРОВАТЬ: не был уверен, если у вас изначально был Bool[] или BitArray. Метод будет так же хорошо для BitArray:
var values = new BitArray(12);
values[0] = true;
values[1] = true;
values[2] = true;
values[3] = true;
values[4] = true;
values[5] = true;
values[6] = true;
values[7] = true;
values[8] = false;
values[9] = true;
values[10] = true;
values[11] = false;
StringBuilder sb = new StringBuilder();
foreach(var b in values){
sb.Append((bool)b ? "1" : "0");
}
sb.ToString();
// prints out "111111110110"
При конвертации обратно с помощью Convert.FromBase64String()
, вы получите массив байтов длиной 2 байта, что составляет 16 бит. Теперь, когда вы изначально создали байтовый массив из BitArray, хотя длина преобразованного ByteArray составляла 2 байта, т.е. снова 16 бит, тем не менее, ваш фактический BitArray имел длину 12 битов. Этот факт известен вам, а не базовой реализации, которая рассматривает байтовый массив длины 16 и, следовательно, создает битовый массив длины 16.
Я не думаю, что есть способ избежать заполнения нулями, и это станет проблемой, когда вы попытаетесь изменить массив, я думаю, что способ обойти это - создать свой собственный тип, который будет иметь переменную, хранящую число байтов, и это должно позволить вам делать код, игнорирующий заполнение при выполнении реверса или других операций.
Вы можете сохранить количество битов перед выполнением values.CopyTo(bytes, 0);
, а затем после выполнения var bytes2 = Convert.FromBase64String(result);
Вы можете сделать битовое смещение с соответствующим количеством битов (чтобы урезать дополненные биты)
Редактировать:
Вы можете сделать битовый сдвиг на полученном битарри:
public static BitArray ShiftRight(this BitArray instance)
{
return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}
(взято с /questions/40222297/bitarray-sdvig-bit/40222328#40222328)