即使我不应该,我仍然会收到Base64无效字符错误.
该程序获取XML文件并将其导出到文档.如果用户想要,它也会压缩文件.压缩工作正常并返回一个Base64字符串,该字符串被编码为UTF-8并写入文件.
当它将文档重新加载到程序中时,我必须检查它是否被压缩,代码只是:
byte[] gzBuffer = System.Convert.FromBase64String(text); return "1F-8B-08" == BitConverter.ToString(new List(gzBuffer).GetRange(4, 3).ToArray());
它检查字符串的开头以查看其中是否包含GZips代码.
现在的问题是,我的所有测试都有效.我拿一根绳子,压缩它,解压缩,并将它与原始的相比较.问题是当我从ADO Recordset返回字符串时.字符串正是写入文件的内容(最后添加了一个"\ 0",但我认为它甚至没有做任何事情,即使修剪它仍然会抛出).我甚至将整个字符串复制并粘贴到测试方法中并压缩/解压缩.工作良好.
测试将通过,但代码将使用完全相同的字符串失败?唯一的区别是,只是声明一个常规字符串并传递它,我从记录集返回一个.
关于我做错什么的任何想法?
你说
字符串正是写入文件的内容(最后添加了"\ 0",但我认为甚至没有做任何事情).
事实上,它确实做了一些事情(它导致你的代码抛出FormatException
:"Base-64字符串中的无效字符")因为Convert.FromBase64String
不认为"\ 0"是有效的Base64字符.
byte[] data1 = Convert.FromBase64String("AAAA\0"); // Throws exception byte[] data2 = Convert.FromBase64String("AAAA"); // Works
解决方案:摆脱零终止. (也许打电话.Trim("\0")
)
备注:
在MSDN文档的Convert.FromBase64String
说,它会抛出一个FormatException
时
忽略空格字符的s的长度不为零或为4的倍数.
-要么-
s的格式无效.s包含非基本64个字符,两个以上的填充字符或填充字符中的非空白字符.
然后
从零开始按升序排列的基数为64位的是大写字母"A"到"Z",小写字母"a"到"z",数字"0"到"9",符号"+"和"/" .