将BitArray转换为具有相同长度的String

时间:2013-01-07 18:16:47

标签: c# bytearray byte bit bitarray

我正在使用这个问题的算法:Convert List<boolean> to 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 个答案:

答案 0 :(得分:1)

为什么不这样做:

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"

答案 1 :(得分:0)

使用Convert.FromBase64String()进行转换时,会得到一个长度 2个字节的字节数组, 16位。现在,当您从BitArray初始创建字节数组时,虽然转换的ByteArray的长度是2个字节,即 16位,但是,实际的BitArray长度 12位。这个事实是知道的,而不是考虑长度为16的字节数组的底层实现,因此创建了长度为16的BitArray。

答案 2 :(得分:0)

我认为有一种方法可以避免0的填充,当你试图反转数组时它会成为一个问题,我认为解决这个问题的方法是创建自己的类型,这将有一个变量存储字节数,这应该允许您在执行反向或其他操作时执行代码以忽略填充。

您可以在执行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());
}

(摘自https://stackoverflow.com/a/7696793/1279594