3

在使用 .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());

}

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

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

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

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

4

1 回答 1

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

我希望它提供一些用处。

于 2013-02-22T15:51:09.417 回答