首页 新闻 会员 周边

FromBase64String(string) 异常

0
悬赏园豆:50 [已解决问题] 解决于 2019-06-06 09:50

在使用 byte[] bytes =Convert.FromBase64String(str); 函数时出现异常情况。
当str 字符串超大超长的时候(一般将一个100M文件转成Base64字符串的长度大小),运行
上面那段代码的时,当程序界面第一次执行时能正常转换,当程序不退出来,再次执行一遍的时候会报System.OutOfMemoryException 内存溢出错误,为什么?有什么办法不?
有那位大神指点一下?

新手Robbie的主页 新手Robbie | 初学一级 | 园豆:157
提问于:2019-05-30 12:22
< >
分享
最佳答案
0
收获园豆:50
dudu | 高人七级 |园豆:30994 | 2019-05-30 12:30

谢谢!dudu。
上面这个参考文章我研究一下。在程序不退出的情况下第二次重复执行时发生的。这个是什么原因?

新手Robbie | 园豆:157 (初学一级) | 2019-05-30 12:38

请问dudu,如果采用Stream 去把Base64 字符串还原成原来的文档咋操作?

新手Robbie | 园豆:157 (初学一级) | 2019-05-30 12:59

@新手123456: 建议提供相关代码

dudu | 园豆:30994 (高人七级) | 2019-05-30 13:33

@dudu: 请教一下帮忙看看,谢谢!
整个功能是从一个比较大的XML文件里读取某个节点的值是经过编码的Base64字符串。然后将这个读取到的Base64 字符串还原成原始文件。在这个读取与还原的整个函数执行过程中,如果遇到多个150M以上的XML文件 执行行时函数会在执行到第二个或者第三个读取XML文件Load时或者读取节点值(ele.GetAttribute("FILENAME");)时报System.OutOfMemoryException异常错误。
函数如下:
private void UnZip()
{
try
{
//this.xmlfilePath.Text 是窗体上测试时 使用选择执行XML文件的路径
using (Stream stream = File.OpenRead(this.xmlfilePath.Text))
{
string filename = string.Empty;
XmlDocument doc = new XmlDocument();
doc.Load(stream);
stream.Close();
stream.Dispose();
XmlNode node = doc.DocumentElement.SelectSingleNode("ATTACHMENT");
XmlElement ele = (XmlElement)node;
filename = ele.GetAttribute("FILENAME");

                var contents = Convert.FromBase64String(ele.InnerText.Trim());
                using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
                {
                    fs.Write(contents, 0, contents.Length);
                    fs.Flush();
                    fs.Dispose();
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
        }
    }
新手Robbie | 园豆:157 (初学一级) | 2019-05-31 16:33

@新手123456: 建议使用 XmlReader ,试试下面的代码

private static void UnZip()
{
    try
    {
        //this.xmlfilePath.Text 是窗体上测试时 使用选择执行XML文件的路径
        var xmlFilePath = this.xmlfilePath.Text;
        using (XmlReader reader = XmlReader.Create(xmlFilePath))
        {
            while (reader.Read())
            {
                if (reader.NodeType.Equals(XmlNodeType.Element))
                {
                    if (reader.Name == "ATTACHMENT")
                    {
                        string filename = reader.GetAttribute("FILENAME");
                        var contents = Convert.FromBase64String(reader.ReadInnerXml().Trim());
                        using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
                        {
                            fs.Write(contents, 0, contents.Length);
                        }
                        break;
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
dudu | 园豆:30994 (高人七级) | 2019-05-31 21:55
其他回答(2)
0

file -read-> stream -base64-> base64Stream -write-> file or network stream.

base64Stream -base64-> stream -read-> string.

czd890 | 园豆:14412 (专家六级) | 2019-05-30 13:34
0

stream原理就是 分段;既然大了 自己分段读分段写不就搞定了。

花飘水流兮 | 园豆:13560 (专家六级) | 2019-05-30 14:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册