c# - Convert.FromBase64String c# 上的 FormatException

标签 c# .net compact-framework base64 formatexception

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

这个大文件是base64格式,但是有两个小细节,用双引号(")括起来的内容和每N个字符有一个\\n (不是换行符 \n,而是实际的 2 个文字字符)。 所以我需要做的是,删除引号和 \\n 或将它们替换为实际的换行符。并且还从 base64 格式转换。

这是我的代码:

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());

}

但是对于这段代码,当我调用 Convert.FromBase64String 时,我要么有一个 OutOfMemoryException,要么有一个 FormatException

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

"U1FMaXRlIGZvcm1hdCAzAAQAAQEAQCAgAAAABAAAI2oAAAAAAAAAAAAAAAQAAAABAAAAAAAAAAAA\\nAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAC3iGgUAAAABA/sAAAAaSQP7\\nApsA0wDTAAAAAAAAAAAAAAAAAAAAAAAAAAA ...

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

最佳答案

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

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

将输出直接发送到文件可能会解决这个问题,但我不知道。没遇到过,不知道怎么测试。

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

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() 不是必需的,但我发现它在垃圾收集器有机会为您清理之前多次调用某个方法的情况下很有帮助。还是安全点好。

我希望它能提供一些用处。

关于c# - Convert.FromBase64String c# 上的 FormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003866/

相关文章:

c# - Windows Mobile - 2 路通话录音 (C#)

.net - cf.net 排队等待 web 服务

c# - 没有黑色细线的 UIView 边框

c# - 如何将 com 或 excel 对象序列化为二进制格式,以便我可以将其存储在 asp.net 的内存流中

c# - 在 64 位 intel 处理器上,对 double 类型变量的读取和写入是否保证是原子的?

c# - Windows 工具栏可停靠应用程序

c# - 如何在XP或7中使用C#连接默认拨号?

带有 .net framework 4.6.1 的 Asp.net Core 2.0 - 找不到引用程序集“.NETFramework/v4.6.1/Microsoft.CSharp.dll”

c# - 如何将 cpp/cli 文件显式链接到 c# 库 .dll?

.net - Funq IoC Container 是否支持属性注入(inject)?