即使不这样做,我仍然会收到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”,但我认为它甚至没有做任何事情,即使修剪它仍然会抛出)。我甚至将整个字符串复制并粘贴到测试方法中并压缩/解压缩。工作正常。
测试将通过,但代码将使用完全相同的字符串失败?唯一的区别是,不是仅仅声明一个常规字符串并传递它,而是从记录集中返回一个字符串。
关于我做错什么的任何想法?
答案 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())