在使用 .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/