14

我不断收到 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 记录集返回的字符串时。该字符串正是写入文件的内容(最后添加了“\ 0”,但我认为它甚至不会做任何事情,即使修剪掉它仍然会抛出)。我什至将整个字符串复制并粘贴到测试方法中并压缩/解压缩。工作正常。

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

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

4

5 回答 5

16

你说

该字符串正是写入文件的内容(最后添加了“\ 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说它会抛出一个FormatExceptionwhen

s 的长度,忽略空格字符,不为零或 4 的倍数。

-或者-

s 的格式无效。s 包含非 base 64 字符、两个以上的填充字符或填充字符中的非空白字符。

然后

从零开始按升序排列的 64 位基数是大写字符“A”到“Z”、小写字符“a”到“z”、数字“0”到“9”以及符号“+”和“/” .

于 2009-04-02T18:00:40.580 回答
3

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

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

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

于 2009-04-02T18:08:58.563 回答
1
string stringToDecrypt = HttpContext.Current.Request.QueryString.ToString()

//更改为字符串 stringToDecrypt = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString.ToString())

于 2018-03-16T10:58:27.747 回答
0

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

于 2009-04-02T19:28:41.617 回答
0

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

于 2012-05-16T06:33:21.187 回答