76 文字の base64 と CRLF を含むコンテンツを含む非常に大きな XML (>1GB)と、最後のコンテンツに「=」が埋め込まれ、CRLF が埋め込まれていません。CDATA
base64 デコードを取得する最も自然な方法は、XmlReader reader.ReadElementContentAsBase64(...) を使用することですが、100Mb で機能しなくなります。(=OOM)
Base64 変換にストリーミングする方法を検索した後、これを見つけました。
string Original = "foo bar, this is an example";
byte[] ToBase64; string Decoded;
using ( MemoryStream ms = new MemoryStream() ) using ( CryptoStream cs = new CryptoStream( ms, new ToBase64Transform(),
CryptoStreamMode.Write ) ) using ( StreamWriter st = new StreamWriter( cs ) ) {
st.Write( Original );
st.Flush();
ToBase64 = ms.ToArray(); }
using ( MemoryStream ms = new MemoryStream( ToBase64 ) ) using ( CryptoStream cs = new CryptoStream( ms, new FromBase64Transform(),
CryptoStreamMode.Read ) ) using ( StreamReader sr = new StreamReader( cs ) ) {
Decoded = sr.ReadToEnd(); }
Console.WriteLine( Original ); Console.WriteLine( Encoding.Default.GetString( ToBase64 ) ); Console.WriteLine( Decoded );
この例には入力として文字列がありますが、このコードを変換してファイルを処理し、ファイル内の位置から読み取りを開始/停止する必要があります。
CData Start CDataEnd | | V V
[xml..[エンベロープ]...[ボディ]76 文字の base64 + CRLF + パディング "="...[/ボディ]...[/エンベロープ]