将 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首先,在这样的循环中连接字符串是个坏主意 - 至少使用 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();
不清楚字节数组的来源......但你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>?
如何将 List<Object> 转换为 List<MyClass>