【问题标题】:Can't decode a base 64 string with Convert.FromBase64String()无法使用 Convert.FromBase64String() 解码 base 64 字符串
【发布时间】:2017-02-03 17:45:14
【问题描述】:

我使用Convert.FromBase64String() 来解码base 64 编码的字符串。该字符串实际上是一个 XML 文件,其中包含 base 64 编码图像。例如

data:image/png;base64,iVBORw0KGgoAA...

我得到以下异常:

System.FormatException:输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符。

问题出在哪里?双基64编码? base 64 编码数据中的字符串image/png;base64?在线工具完全没有问题。

编辑:

现在我尝试从 XML 文件中删除 image/png;base64 部分,但我仍然收到此错误。然后我尝试用同样的错误解码字符串YWJj!?如果我使用此代码

byte[] dataBuffer = Convert.FromBase64String(base64string);

我得到了上述异常。如果我改用

byte[] dataBuffer = Convert.FromBase64String("YWJj");

确实有效。根据 Notepad++,文件的编码是UTF-8。有什么想法吗?

编辑 2:

String.Equals 表示两个字符串 YWJj 不相等,尽管 Locals 窗口显示它们是:

顺便说一句,上面的代码没有抛出异常,因为我使用了string test = "YWJj";。为什么它适用于本地定义的变量,但不适用于传递的字符串?我觉得不是线程问题,因为我做了上面的函数,只调用了一次。

【问题讨论】:

  • 您不应该删除data:image/png;base64, 部分吗?
  • 只使用数据的编码部分作为Convert.FromBase64String()的输入
  • 我无法删除它。但问题是Convert.FromBase64String() 是否不适用于此类字符串...
  • 显示代码如何删除image/png;base64 并显示调试时的变量值。
  • @BWA:我直接从文件中删除了image/png;base64,然后将其进行base 64编码并保存为项目中的文件。然后我以字符串的形式读取文件并尝试对其进行解码。

标签: c# base64


【解决方案1】:

您应该从字符串中删除data:image/png;base64, 部分以进行解码。

strind data = "data:image/png;base64,iVBORw0KGgoAA...";
string[] pd = data.Split(',');

string decoded = Convert.FromBase64String(pd[1]);

字符串data:image/png;base64, 的部分不是base64 数据。真正的编码数据在, 之后开始。 Base64 description。所以函数Convert.FromBase64String 只接受编码数据。因此,您需要提取编码数据。

【讨论】:

    【解决方案2】:

    正如我已经写过的,我正在读取 base 64 编码文件并使用Convert.FromBase64String() 对其进行解码。现在我让它工作了,原因完全不知道。我做了什么?

    我重命名了文件。就是这样。

    在我有像NAME_Something_v1.0.xsl.b64 这样的文件名之前。现在我使用NAME_Something.b64。也许这不是唯一的原因,但我正在使用assembly.GetManifestResourceStream() 从程序集中访问文件。我之前已经清理过解决方案,但我总是遇到同样的问题。现在我将名称改回原来的位置,它也可以使用...

    【讨论】:

      【解决方案3】:

      1.您不应包含data:image/png;base64, 部分,因为这实际上不是base64 字符串的一部分。

      2. iVBORw0KGgoAA... 也无效,这不是完整的 base64 字符串。

      您可以通过拆分字符串或使用正则表达式对其进行解析来解决此问题。

      【讨论】:

        【解决方案4】:

        data:image/png;base64, 之后的所有内容都是要解码的实际 Base64 字符串。

        您可以像这样删除字符串的第一部分:

        ImageAsString = ImageAsString.Substring(input.IndexOf('data:image/png;base64,') + 1);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-17
          • 2021-10-14
          • 1970-01-01
          • 2015-12-06
          • 1970-01-01
          相关资源
          最近更新 更多