2016-11-08 59 views
0

也許它不是一類名爲Web客戶端把一個數據URI成一個byte []的責任,但我想我可以「下載」一個數據uri而無需自己做這一切嗎?

var client = new WebClient(); 
var result = client.DownloadData(uri); 

給出一個URI看起來像

數據:圖像/ GIF ; BASE64,R0lGODlhAQABAIAAAAAAAP /// yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

,並得到了引發WebException說

無法識別URI前綴。

如何以最簡單的方式解碼數據uri?

Convert.FromBase64String(str)解碼這樣的URI中的問題是,我需要提取部分

R0lGODlhAQABAIAAAAAAAP /// yH5BAEAAAAALAAAAAABAAEAAAIBRAA7

第一,這當然是一個很小的任務。

但是,當文件變大時,需要我分配大量內存才能獲得幾乎相等的字符串。 Convert.FromBase64String沒有偏移參數是個謎。

如果我不想額外分配,我是否需要自己完成整個base64解碼?

+0

base64是臭名昭着的不適合大型存儲。 在附註中,如果您已經有base64編碼的字符串,那麼爲什麼您需要首先通過「WebClient」傳遞? –

+0

我希望通過WebClient轉換它。 –

回答

0

afaik,您可以通過使用特定的基類Encoding來只轉換部分字符串。 (而不是將整個事情一氣呵成)

,如果你正在處理的網絡的東西,我想你想UTF8

這些東西線中: (本例中沒有做正是什麼你想通過一個base64編碼字符串做)

string completeMessage = ""; 
int byteStepSize = 4; 

for(int i=0; i < byteStepSize; i+= byteStepSize) 
{ 
    string subStr = str.SubString(i, i+byteStepSize); 
    completeMessage += encoding.UTF8.GetString(Convert.FromBase64String(subStr)); 
} 

你可以(理論上)流這種方式,防止需要一次性全部分配它。

+0

問題是如果文件很大,我不能/不想創建額外的子字符串。 –

+0

這個設置背後的想法是,你可以使用循環來保持子字符串分配/內存佔用更小。 –

+1

要將*從*任意字節*轉換爲* base 64,您一次可以處理3個字節。由於每3個輸入字節產生4個輸出字符。這應該告訴你,在另一個方向上轉換3個角色是不安全的。 (但是,您可以一次處理4個字符) –

相關問題