转换列表<;布尔值>;到字符串

本文关键字:字符串 gt 布尔值 lt 转换 列表 | 更新日期: 2023-09-27 18:24:17

我得到了一个有92个布尔值的布尔值列表,我想把这个列表转换成一个字符串,我想我会取8个布尔值(位),把它们放在一个字节(8位)中,然后用ASCII把字节值转换成字符,然后把字符添加到一个字符串中。然而,在粘了2个多小时后,没有运气。我尝试将列表转换为字节列表,但也不起作用^^。

String strbyte = null;
for (int x = 0; x != tmpboolist.Count; x++) //tmpboolist is the 90+- boolean list
{
   //this loop checks for true then puts a 1 or a 0 in the string(strbyte)
   if (tmpboolist[x])
   {
      strbyte = strbyte + '1'; 
   }
   else
   {
      strbyte = strbyte + '0';
   }
}
//here I try to convert the string to a byte list but no success
//no success because the testbytearray has the SAME size as the 
//tmpboolist(but it should have less since 8 booleans should be 1 Byte)
//however all the 'Bytes' are 48 & 49 (which is 1 and 0 according to
//http://www.asciitable.com/)
Byte[] testbytearray = Encoding.Default.GetBytes(strbyte); 

PS如果有人对如何编码有更好的建议&将布尔列表解码为字符串?(因为我希望人们用字符串共享他们的布尔列表,而不是90个1和0的列表。)

编辑:现在开始工作了!感谢你们帮助

string text = new string(tmpboolist.Select(x => x ? '1' : '0').ToArray());
byte[] bytes = getBitwiseByteArray(text); //http://stackoverflow.com/a/6756231/1184013
String Arraycode = Convert.ToBase64String(bytes);
System.Windows.MessageBox.Show(Arraycode);
//first it makes a string out of the boolean list then it uses the converter to make it an Byte[](array), then we use the base64 encoding to make the byte[] a String.(that can be decoded later)

稍后我将查看编码32,再次获取所有帮助:)

转换列表<;布尔值>;到字符串

您应该将布尔值存储在BitArray中。

var values = new BitArray(92);
values[0] = false;
values[1] = true;
values[2] = true;
...

然后您可以将BitArray转换为字节数组

var bytes = new byte[(values.Length + 7) / 8];
values.CopyTo(bytes);

和字节数组到Base64字符串

var result = Convert.ToBase64String(bytes);

相反,您可以将Base64字符串转换为字节数组

var bytes2 = Convert.FromBase64String(result);

将字节数组转换为BitArray

var values2 = new BitArray(bytes2);

Base64字符串如下所示:"Liwd7bRv6TMY2cNE"。这对于人与人之间的分享来说可能有点不愉快;看看以人为本的base-32编码:

这些[基-32字符串]的预期用途包括剪切-和粘贴,文本编辑(例如在HTML文件中),通过键盘,通过笔和纸手动转录,声乐转录电话或收音机等

这种编码的需求是:

  • 最小化转录错误--例如众所周知的混淆问题"0"与"O"
  • 嵌入到其他结构中——例如搜索引擎,结构化或标记的文本、文件系统、命令外壳
  • 简短--较短的字符串比较长的字符串更好
  • 人机工程学——人类用户(尤其是非技术用户)应该找到[字符串]尽可能轻松愉快。绳子看起来越丑,就越糟糕

首先,在这样的循环中连接字符串是个坏主意-至少使用StringBuilder,或者在LINQ:中使用类似的东西

string text = new string(tmpboolist.Select(x => x ? '1' : '0').ToArray());

但是,使用LINQ可以很容易地将字符串转换为List<bool>,因为string实现了IEnumerable<char>:

List<bool> values = text.Select(c => c == '1').ToList();

字节数组的来源尚不清楚…但您应该而不是尝试仅使用Encoding.GetString来表示字符串中的任意二进制数据。这不是它的目的。

如果你不在乎字符串使用什么格式,那么使用Base64会很好——但要注意,如果你将布尔值分组为字节,如果你需要区分"7个值"answers"8个值,其中第一个为False",你将需要额外的信息。

由于我从您的代码中推断,您需要一个n位数字为1或0的字符串,这取决于内部列表布尔值,那么。。。

public override string ToString()
{
    StringBuilder output = new StringBuilder(91);
    foreach(bool item in this.tempboolist)
    {
        output.Append(item ? "1" : "0");
    }
    return output.ToString();
}

警告这是即兴键入,我还没有用编译器验证过!

此函数可以执行您想要的操作:

    public String convertBArrayToStr(bool[] input)
    {
        if (input == null)
            return "";
        int length = input.Count();
        int byteArrayCount = (input.Count() - 1) / 8 + 1;
        var bytes = new char[byteArrayCount];
        for (int i = 0; i < length; i++ )
        {
            var mappedIndex = (i - 1) / 8;
            bytes[mappedIndex] = (char)(2 * bytes[mappedIndex] +(input[i] == true ? 1 : 0));
        }
        return new string(bytes);
    }