Convert.FromBase64String在代码中不起作用,但适用于在线工具

时间:2017-07-02 02:01:07

标签: c# base64

我正在编写一个C#应用程序来解码这个字符串:

  

“ - W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 =”

当我将其复制/粘贴到此在线工具中时,它会起作用:https://www.base64decode.org

但是当我使用Convert.FromBase64String(str)时,它会引发异常:

  

System.FormatException:输入不是有效的Base-64字符串   包含一个非基础64个字符,两个以上的填充字符,或   填充字符中的非法字符。

为什么?

3 个答案:

答案 0 :(得分:12)

网址解码会从base64字符串中删除+,使其无效。我没有理由拒绝投票给我指出它。阅读此问题的其他人将使用该代码并且存在缺陷。如果你解码'a + ==',结果将是字符'k'。如果您使用URL解码来解码'a + ==',则URL解码会将字符串转换为'a ==',并且您将尝试解码它。[/ p>

简而言之,.Net Framework使用的是Base64编码的变体,它不允许使用无效字符,并且该网站使用的PHP正在使用另一种允许无效字符但却丢弃它们的变体。

Base64编码将三个八位字节转换为四个编码字符。 Base64编码中64个字符中前62个的有效字符:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

有几种变体允许字符62和63使用不同的字符。对于C#,与最常见的变体一样,完整字符集为:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

https://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx

  

从零开始按升序排列的基数为64的数字为大写   字符“A”到“Z”,小写字母“a”到“z”,   数字“0”到“9”,符号“+”和“/”。没有价值   character,“=”,用于尾随填充。

已知此变体是RFC 3548或RFC 4648的标准“base64”编码,除非另有说明,否则禁止使用无效值。

PHP使用MIME的Base64传输编码(RFC 2045),它允许无效的字符但丢弃它们。

在所有其他Base64变体中,禁止使用无效字符。

如果原始Base64实际上应该包含-字符,那么它使用的是另一种变体。

请参阅:https://en.wikipedia.org/wiki/Base64#Variants_summary_table

答案 1 :(得分:6)

您的代码不是有效的Base64字符串。 - 字符串开头的 - 字符无效。你可以这样转换它。

using System;
using System.Text;

var decodedString = "--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0="
    .Replace("-", "");
var bytes = Convert.FromBase64String(decodedString);
var encodedString = Encoding.UTF8.GetString(bytes);
Console.WriteLine(encodedString);

答案 2 :(得分:0)

您必须像上面提到的那样从字符串中删除--前缀。我想补充一点,当使用data:image/jpeg;base64,时,在base64字符串中有Convert.FromBase64String(str)前缀时,也会遇到相同的错误。

从字符串中删除data:image/jpeg;base64,有用。