我不断收到一个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())

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top