在使用.NET CF的Windows CE設備上。我從REST服務的流中收到一個大文件(12MB)。Convert.FromBase64String上的FormatException c#
這個大文件是Base64格式,但它有兩個小細節,用雙引號("
)和每N個字符包圍的內容有一個\\n
(不換行字符\n
,但實際2個文本字符) 。 所以我需要做的是,刪除引號和\\n
或用實際的換行符替換它們。並且還從base64格式轉換。
這是我的代碼:
var input = ApplicationContext.restProxy.GetData();
using (StreamReader sr = new StreamReader(input))
{
StringBuilder sb = new StringBuilder();
char[] buffer = new char[32];
while (sr.Read(buffer, 0, 32) > 0)
{
var s = new string(buffer);
s = s.Replace("\\n", "\n");
s = s.Trim('"');
sb.Append(s);
}
byte[] fileBytes = Convert.FromBase64String(sb.ToString());
}
但有了這個代碼,我要麼有OutOfMemoryException
,或FormatException
當我打電話了Convert.FromBase64String
。
一些輸入數據的格式如下:
"U1FMaXRlIGZvcm1hdCAzAAQAAQEAQCAgAAAABAAAI2oAAAAAAAAAAAAAAAQAAAABAAAAAAAAAAAA\\nAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAC3iGgUAAAABA/sAAAAaSQP7\\nApsA0wDTAAAAAAAAAAAAAAAAAAAAAAAAAAA ...
我該怎麼辦沒有填補了設備的內存這些操作,或者有什麼不對結果字符串的格式?
你的代碼的一個明顯的失敗模式是Read()調用返回'\\'但還不是n。修復這將增加你用完內存的機率。幾乎沒有什麼方法可以贏得這裏,我想,請給服務負責人發送一封惡意郵件,讓自己感覺更好。 – 2013-02-21 15:16:49
你得到的'FormatException'是因爲最後一個'sr.Read'將返回不完整的緩衝區(少於32字節),但你在'sb.Append(s)'中追加所有32。你應該使用另一個具有'count'參數的'Append'重載。 – torvin 2013-02-22 06:55:37
爲什麼要從TextReader讀取二進制數據? – leppie 2013-02-22 15:52:40