从Byte数组转换为List

时间:2012-01-30 00:10:29

标签: c# arrays list byte

我正在将List<string>转换为如下字节数组:

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

如何将其转换回List<string>?我尝试在上面的代码中使用ASCII.GetString(s),但GetString期望byte[],而不是单个字节。

4 个答案:

答案 0 :(得分:5)

无法撤消您的算法。

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

您可以只使用内置于.NET框架中的serialization,而不是发明自己的序列化格式,例如BinaryFormatter

答案 1 :(得分: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;
}

答案 2 :(得分:1)

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

示例(假设|不能是用户名的一部分):

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

答案 3 :(得分:1)

由于数组结构的分隔符在SelectMany方法中丢失,因此无法执行此操作。