2012-01-30 80 views
0

我转换List<string>成字节数组是这样的:转换到一个列表

Byte[] bArray = userList 
       .SelectMany(s => System.Text.Encoding.ASCII.GetByte(s)) 
       .ToArray(); 

我怎样才能将其转换回一个List<string>?我在上面的代码中尝试使用ASCII.GetString(s),但GetString预计为byte[],而不是单个字节。

+1

您需要某种方式将您的巨型字节流拆分为多个字符串。 – SLaks 2012-01-30 00:12:55

+0

类似'bArray.ToList()'?或者你的原始列表中有多个字符串? – 2012-01-30 00:13:05

+0

原始列表有多个字符串,但我不知道如何分割它。或者,有没有更好的方法将字符串列表转换为字节数组或流的字符串? – Skoder 2012-01-30 00:14:36

回答

5

这是不可能扭转你的算法。

如果您考虑在两个用户名为“ab”和“c”时会发生什么情况,可以看到问题。这将给出完全相同的字节,就像有两个用户称为“a”和“bc”一样。用你的方法无法区分这两种情况。

而不是发明自己的序列化格式,你可以只是内置到.NET框架中的serialization,如BinaryFormatter

+0

谢谢,我将使用一个序列化程序。因为我有上面的代码,所以我想我可能错过了一些简单的东西来扭转这个过程。我会在几分钟内接受你的回答。 – Skoder 2012-01-30 00:21:23

1

您需要在字符串之间插入分隔符,以便将大字节数组拆分回原始用户。分隔符应该是不能成为用户名的一部分的字符。

实施例(假定|不能是一个用户名的部分):

var bytes = System.Text.Encoding.ASCII.GetByte(string.Join("|", userList.ToArray())); 
1

不能做到这一点,因为阵列结构的分隔符在SelectMany方法丢失了。

3

作为一种旁注,如果保留零字节字符串终止,您可以轻松地串接字符串并提取所有信息,例如,

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