Convert.FromBase64String上的FormatException c#

时间:2013-02-21 13:46:59

标签: c# .net compact-framework base64 formatexception

在使用.NET CF的Windows CE设备上。我在REST服务的流中收到一个大文件(12MB)。

这个大文件是base64格式,但它有两个小细节,内容用双引号(")包围,每N个字符都有一个\\n(不是换行符{{ 1}},但实际的2个字面字符)。 所以我需要做的是,删除引号以及\n或用实际换行符替换它们。并且还从base64格式转换。

这是我的代码:

\\n

但是使用此代码,当我调用var input = ApplicationContext.restProxy.GetData(); using (StreamReader sr = new StreamReader(input)) { StringBuilder sb = new StringBuilder(); char[] buffer = new char[32]; while (sr.Read(buffer, 0, 32) > 0) { var s = new string(buffer); s = s.Replace("\\n", "\n"); s = s.Trim('"'); sb.Append(s); } byte[] fileBytes = Convert.FromBase64String(sb.ToString()); } 时,我要么有OutOfMemoryException,要么FormatException

某些输入数据具有以下格式:

Convert.FromBase64String

如何在不填满设备内存的情况下执行这些操作,或者生成的字符串格式有什么问题?

1 个答案:

答案 0 :(得分:1)

如果您写入逐个字符检查的缓冲区,则可以获得更好的结果。

此外,由于文件太大,您可以通过将此数据直接写入输出文件来获得更好的结果。否则,您试图将所有这些数据保存在内存中。

将输出直接发送到文件可能会解决这个问题,但我不知道。我从来没有遇到过,所以我不知道如何测试它。

以下是一个可以解决您的问题的示例方法:

private void ReadData(Stream input) {
  using (StreamReader sr = new StreamReader(input)) {
    using (StreamWriter sw = new StreamWriter(File.Create("outfile.dat"))) {
      char[] buffer = new char[32];
      while (-1 < sr.Peek()) {
        int len = sr.Read(buffer, 0, 32);
        List<char> output = new List<char>();
        for (int i = 0; i < len; i++) {
          char c = buffer[i];
          if ((c != '\\') && (c != '\n')) {
            output.Add(c);
          }
        }
        sw.Write(output.ToArray());
      }
      sw.Flush();
      sw.Close();
    }
    sr.Close();
  }
}

虽然不需要Close(),但我发现在垃圾收集器有机会为您清理之前,您可以多次调用某种方法会有所帮助。安全起见会更好。

我希望它提供一些用途。