Преобразовать BitArray в строку одинаковой длины

Я использую алгоритм этого вопроса: Конвертировать List в String (выбранный ответ)

Но я имею дело с длиной 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)

Другие вопросы по тегам