2016-11-08 12 views
0

は、多分それはバイト[]にデータのURIを有効にするクラスの名前Webクライアントの責任ではないですが、私は私は自分でデータURIをダウンロードする必要はありませんか?

データのように見えるURI与え

var client = new WebClient(); 
var result = client.DownloadData(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

任意バイト*を*から* base64に変換する場合、一度に3バイトを処理できます。 3入力バイトごとに4つの出力文字が生成されるためです。これは、他の方向に変換しているときに働く3つの文字が仮定するのが安全ではないことを伝えます。 (あなたは一度に4文字を扱うことができます) –

関連する問題