转换列表<;布尔值>;到字符串
本文关键字:字符串 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);
}