无法使用Convert.FromBase64String()

时间:2016-09-26 11:40:17

标签: c# base64

我正在使用Convert.FromBase64String()来解码基本64位编码的字符串。该字符串实际上是一个XML文件,其中包含基本64位编码图像。 E.g。

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

我得到以下异常:

  

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

问题出在哪里?双基64编码?基础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窗口显示它们是:

not equal

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

4 个答案:

答案 0 :(得分:2)

您应该从字符串中删除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仅接受编码数据。因此,您需要提取编码数据。

答案 1 :(得分:1)

正如我已经写过的那样,我正在读取基本64位编码文件并使用Convert.FromBase64String()对其进行解码。现在我开始工作了,原因完全不可知。我做了什么?

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

您可以删除字符串的第一部分,如下所示:

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