Base64字符串抛出无效字符错误

时间:2009-04-02 17:51:05

标签: c# string ado.net base64 invalid-characters

即使不这样做,我仍然会收到Base64无效字符错误。

该程序获取XML文件并将其导出到文档。如果用户想要,它也会压缩文件。压缩工作正常并返回一个Base64字符串,该字符串被编码为UTF-8并写入文件。

当它将文档重新加载到程序中时,我必须检查它是否被压缩,代码只是:

byte[] gzBuffer = System.Convert.FromBase64String(text);
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());

它检查字符串的开头是否有GZips代码。

现在问题是,我的所有测试都有效。我拿一根绳子,压缩它,解压缩,并将它与原始的相比较。问题是当我从ADO Recordset返回字符串时。字符串正是写入文件的内容(最后添加了一个“\ 0”,但我认为它甚至没有做任何事情,即使修剪它仍然会抛出)。我甚至将整个字符串复制并粘贴到测试方法中并压缩/解压缩。工作正常。

测试将通过,但代码将使用完全相同的字符串失败?唯一的区别是,不是仅仅声明一个常规字符串并传递它,而是从记录集中返回一个字符串。

关于我做错什么的任何想法?

5 个答案:

答案 0 :(得分:15)

你说

  

字符串正是写的   到文件(添加一个   “\ 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 docs for Convert.FromBase64String表示在

时会抛出FormatException
  

s的长度,忽略空格   字符,不是零或多个   4。

     

- 或 -

     

s的格式无效。 s包含非基数64个字符,更多   两个填充字符,或一个   非空白字符   填充字符。

那个

  

基本64位数字按升序排列   从零开始是大写字符   'A'到'Z',小写字母'a'   'z',数字'0'到'9',以及   符号'+'和'/'。

答案 1 :(得分:3)

是否允许使用null char实际上取决于所讨论的base64编解码器。 鉴于Base64标准的模糊性(没有权威的确切规范),许多实现只会忽略它作为空白。然后其他人可以将其标记为问题。最吵闹的人不会注意到,并乐意尝试解码它......: - /

但听起来c#实现并不喜欢它(这是一种有效的方法),所以如果删除它有帮助,那就应该这样做。

另外一个小评论:UTF-8不是必需的,ISO-8859-x又名Latin-x,7位Ascii也可以。这是因为Base64专门设计为仅使用7位子集,该子集适用于所有7位ascii兼容编码。

答案 2 :(得分:0)

如果从字符串末尾删除\ 0是不可能的,您可以为您编码的每个字符串添加自己的字符,并在解码时将其删除。

答案 3 :(得分:0)

从字符串转换Base64的一个问题是,某些转换函数使用前面的“data:image / jpg; base64”,而其他转换函数只接受实际数据。

答案 4 :(得分:0)

["Users({userId}/Tags)"]

//改为 string stringToDecrypt = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString.ToString())