2

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 + パディング "="...[/ボディ]...[/エンベロープ]

4

1 に答える 1

0

これは私が作成できる最高のものです.. int readbytes = 0;

                long bytesToRead = (CDataEnd - CDataStart);
                using (CryptoStream cryptoStremFromBase64 = new CryptoStream(context.OutStream, new FromBase64Transform(FromBase64TransformMode.IgnoreWhiteSpaces), CryptoStreamMode.Write))
                {


                    byte[] bytebuffer = new byte[bytesToRead % 10485760];
                    readbytes = context.InStream.Read(bytebuffer, 0, bytebuffer.Length);
                    cryptoStremFromBase64.Write(bytebuffer, 0, bytebuffer.Length);

                    while (context.InStream.Position < CDataEnd)
                    {
                        WriteToLog("Context.Instream.Position = " + context.InStream.Position.ToString(), context, startingTime);
                        byte[] bytebuffer2 = new byte[10485760];
                        readbytes = context.InStream.Read(bytebuffer2, 0, bytebuffer2.Length);
                        cryptoStremFromBase64.Write(bytebuffer2, 0, bytebuffer2.Length);
                    }


                    cryptoStremFromBase64.Flush();

                }

Context.InStream は、base64 コンテキストを持つ SOAP です。Outstream は、base64 から変換された後の本体の出力です。

これを改善する方法はありますか?

于 2012-10-18T07:04:16.330 に答える