从字节数组转换为列表
本文关键字:列表 转换 数组 字节 字节数 | 更新日期: 2023-09-27 18:21:54
我正在将List<string>
转换为如下字节数组:
Byte[] bArray = userList
.SelectMany(s => System.Text.Encoding.ASCII.GetByte(s))
.ToArray();
如何将其转换回List<string>
?我尝试在上面的代码中使用ASCII.GetString(s)
,但GetString
需要一个byte[]
,而不是一个字节。
不可能反转您的算法。
如果你考虑一下当你有两个名为"ab"answers"c"的用户时会发生什么,这个问题就会显现出来。这将提供完全相同的字节,就像您有两个名为"a"answers"bc"的用户一样。用你的方法无法区分这两种情况。
您不需要发明自己的序列化格式,而只需要在.NET框架中构建序列化,例如BinaryFormatter
。
作为一个附带说明,如果您保留零字节字符串终止,您可以很容易地连接字符串并提取所有信息,例如
Byte[] bArray = userList
.SelectMany(s => System.Text.Encoding.ASCII.GetBytes(s + ''0')) // Add 0 byte
.ToArray();
List<string> names = new List<string>();
for (int i = 0; i < bArray.Length; i++)
{
int end = i;
while (bArray[end] != 0) // Scan for zero byte
end++;
var length = end - i;
var word = new byte[length];
Array.Copy(bArray, i, word, 0, length);
names.Add(ASCIIEncoding.ASCII.GetString(word));
i += length;
}
您需要在字符串之间插入一个delimter,以便将大字节数组拆分回原始用户。分隔符应该是不能作为用户名一部分的字符。
示例(假设|
不能是用户名的一部分):
var bytes = System.Text.Encoding.ASCII.GetByte(string.Join("|", userList.ToArray()));
由于SelectMany
方法中丢失了数组结构的分隔符,因此无法执行此操作。