Base64编码字符串抛出无效字符错误
-
22-08-2019 - |
题
我不断收到一个Base64无效字符错误,即使我不应该。
该方案需要一个XML文件,并将其输出到一个文档。如果用户希望,这将压缩文件中。压缩工作正常,并返回其编码成UTF-8和写入到一个文件一个Base64字符串。
当它的时间来将文档加载到程序我要检查其是否压缩与否,代码只是:
byte[] gzBuffer = System.Convert.FromBase64String(text);
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());
它检查字符串的开头,看它是否具有的gzip的代码在它
现在的问题是,我所有的测试工作。我拿一个字符串,压缩,解压缩,并将其与原来的。问题是,当我从ADO记录集返回的字符串。该字符串正是被写入到文件(在末尾增加了一个“\ 0”,但我不认为,即使做任何事情,甚至修剪掉它仍然抛出)。我甚至整个字符串复制并粘贴到测试方法和压缩/解压缩。工作正常。
该测试将通过但代码将使用完全相同的字符串失败?唯一的区别是刚刚宣布一个普通字符串,并通过它在我得到一个从结果返回来代替。
这是我在做什么任何想法错了?
解决方案
您说
该字符串正是写 该文件(加的 “\ 0”结尾,但我不认为 即使做任何事情)。
在事实上,它做一些事情(它会导致你的代码抛出FormatException
:“无效字符在基地-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”,并且 符号 '+' 和“/'.
其他提示
是否为空字符被允许或不真的取决于BASE64编码解码器中的问题。 Base64编码标准给出含糊(没有权威确切的规格),许多实现会忽略它的空白。和其他人可以将其标记为一个问题。而那些buggiest不会注意到并且会愉快地尝试解码它...: - /
但它听起来C#实现不喜欢它(这是一个有效的方法),所以如果删除有帮助,是应该做的。
一个次要附加评论:UTF-8不是必须的,ISO-8859-X又名拉丁-X,和7位ASCII将正常工作。这是因为Base64的是专门设计为仅使用7位的子集,其与所有的7位ASCII编码兼容的工作。
如果从字符串末尾删除\ 0是不可能的,你可以添加自己的角色为每个编码字符串,并删除它的解码。
有一个问题是与从一个串转换Base64是,某些转换函数使用前述“数据:图像/ JPG; BASE64,”等仅接受的实际数据
string stringToDecrypt = HttpContext.Current.Request.QueryString.ToString()
//变化到 串stringToDecrypt = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString.ToString())