将 List<boolean> 转换为字符串

Posted

技术标签:

【中文标题】将 List<boolean> 转换为字符串【英文标题】:Convert List<boolean> to String 【发布时间】:2012-03-03 05:43:01 【问题描述】:

我有一个包含 92 个布尔值的布尔列表,我希望将列表转换为字符串,我想我会取 8 个布尔值(位)并将它们放在一个字节(8 位)中,然后使用 ASCII 进行转换它将字节值添加到字符然后将字符添加到字符串。然而,在谷歌搜索超过 2 小时后,atm 没有运气。我尝试将列表转换为字节列表,但它也不起作用^^。

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://***.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)

稍后我将研究 encoding32,再次寻求所有帮助 :)

【问题讨论】:

您需要更具体地说明您希望字符串的外观 不清楚你想得到什么。一个字符串,它是位的 ascii 编码,然后可以转回布尔值? Encoding.Default.GetBytes 不会像您认为的那样做。看到这个问题:***.com/questions/2989695/… 如果你想用字符串表示布尔列表,我建议使用十六进制字符 (0-9, af),它将 4 位打包到每个字符中,而不是将 8 位打包到一个字符中.如果将 8 位打包成一个 char,这将使用 8 位 ascii 的全部范围,其中包括一些不可打印的字符。例如。值 00000111 = 7 = 响铃字符。最好表示为 0000 0111 => "07"。 请注意,92 不能被 8 整除。您将需要处理 4 个孤立位。 【参考方案1】:

您应该将布尔值存储在 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"。这对于人与人之间的共享可能有点不方便;看看human-oriented base-32 encoding:

这些 [base-32 字符串] 的预期用途包括 cut- 并粘贴、文本编辑(例如在 html 文件中)、通过 键盘,通过笔和纸手动转录,通过语音转录 电话或收音机等。

这种编码的要求是:

最大限度地减少转录错误——例如众所周知的混淆问题 '0' 和 'O' 嵌入到其他结构中——例如搜索引擎,结构化或 标记文本、文件系统、命令外壳 简洁 -- [字符串] 越短越好。 人体工程学——人类用户(尤其是非技术用户)应该找到 [字符串] 尽可能轻松愉快。 [字符串] 看起来越丑,越糟糕。

【讨论】:

干杯,我不介意它是 base 64 我认为,这是一个 ppl 可以共享的代码(99% 将是复制和粘贴)然后导入应用程序,他们将能够看看他们有什么项目(真)或没有(假)。编辑:我不想将它存储在 BitArray 中,因为它可以增长(列表)所以大小可能会增加,所以使用 List 更容易。对:p? 以防万一:Base32Encoding Implementation For .NET 我使用布尔列表,所以第一部分不起作用,但其余部分起作用,但我仍然需要找到一种方法让我的 tmpboollist 到 Byte[]。【参考方案2】:

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

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

但是使用 LINQ 将字符串转换为 List&lt;bool&gt; 很容易,因为 string 实现了 IEnumerable&lt;char&gt;

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

不清楚字节数组的来源......但你should not try to represent arbitrary binary data in a string just using Encoding.GetString。这不是它的用途。

如果您不关心您的字符串使用什么格式,那么使用 Base64 会很好 - 但请注意,如果您将布尔值分组为字节,如果您需要区分“比如7个值”和“8个值,第一个是False”。

【讨论】:

感谢您的帮助,现在我不再需要 for 循环了! :)【参考方案3】:

由于我是从您的代码中推断出的,因此您想要一个包含 n 位 1 或 0 的字符串,具体取决于内部列表 bool 值,那么如何...

public override string ToString()

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

警告这是即兴打字,我还没有用编译器验证这个!

【讨论】:

【参考方案4】:

这个函数做你想做的:

    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);
    

【讨论】:

以上是关于将 List<boolean> 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 List<List<Integer>> 转换为 int[][]

如何将 List<string> 转换为 List<myEnumType>?

可以将boolean类型的数值转换为其他基本数据类型吗

如何将 List<Object> 转换为 List<MyClass>

将 List<List<string>> 转换为 string[][] 的快速方法是啥?

将 List<DerivedClass> 转换为 List<BaseClass>