2012-01-30 82 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; 
}