我轉換List<string>
成字節數組是這樣的:轉換到一個列表
Byte[] bArray = userList
.SelectMany(s => System.Text.Encoding.ASCII.GetByte(s))
.ToArray();
我怎樣才能將其轉換回一個List<string>
?我在上面的代碼中嘗試使用ASCII.GetString(s)
,但GetString
預計爲byte[]
,而不是單個字節。
我轉換List<string>
成字節數組是這樣的:轉換到一個列表
Byte[] bArray = userList
.SelectMany(s => System.Text.Encoding.ASCII.GetByte(s))
.ToArray();
我怎樣才能將其轉換回一個List<string>
?我在上面的代碼中嘗試使用ASCII.GetString(s)
,但GetString
預計爲byte[]
,而不是單個字節。
這是不可能扭轉你的算法。
如果您考慮在兩個用戶名爲「ab」和「c」時會發生什麼情況,可以看到問題。這將給出完全相同的字節,就像有兩個用戶稱爲「a」和「bc」一樣。用你的方法無法區分這兩種情況。
而不是發明自己的序列化格式,你可以只是內置到.NET框架中的serialization,如BinaryFormatter
。
謝謝,我將使用一個序列化程序。因爲我有上面的代碼,所以我想我可能錯過了一些簡單的東西來扭轉這個過程。我會在幾分鐘內接受你的回答。 – Skoder 2012-01-30 00:21:23
您需要在字符串之間插入分隔符,以便將大字節數組拆分回原始用戶。分隔符應該是不能成爲用戶名的一部分的字符。
實施例(假定|
不能是一個用戶名的部分):
var bytes = System.Text.Encoding.ASCII.GetByte(string.Join("|", userList.ToArray()));
不能做到這一點,因爲陣列結構的分隔符在SelectMany
方法丟失了。
作爲一種旁註,如果保留零字節字符串終止,您可以輕鬆地串接字符串並提取所有信息,例如,
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;
}
您需要某種方式將您的巨型字節流拆分爲多個字符串。 – SLaks 2012-01-30 00:12:55
類似'bArray.ToList()'?或者你的原始列表中有多個字符串? – 2012-01-30 00:13:05
原始列表有多個字符串,但我不知道如何分割它。或者,有沒有更好的方法將字符串列表轉換爲字節數組或流的字符串? – Skoder 2012-01-30 00:14:36