【问题标题】:Convert BitArray to String with same Length将 BitArray 转换为具有相同长度的字符串
【发布时间】:2012-12-21 12:27:18
【问题描述】:

我正在使用这个问题的算法: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;
    }
}

【问题讨论】:

  • 请显示您遇到的错误或问题的代码..
  • 你看过BitArrayToStr()方法吗..?

标签: c# bytearray byte bit bitarray


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为没有办法避免 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

    【讨论】:

      【解决方案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"
      

      【讨论】:

      • 好吧,我计划在该数组中包含 300 个布尔项,这就是我试图通过 BitArray 压缩它的原因
      • 算法无论如何都会起作用。您是否正在寻找特定的性能基准?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多