2016-11-08 66 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个字符) –

相关问题