无法使用 Convert.FromBase64String() 解码 base 64 字符串

Can't decode a base 64 string with Convert.FromBase64String()

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

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

我得到以下异常:

System.FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

问题出在哪里?双base 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 Window 表明它们是:

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

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

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

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

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

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

ImageAsString = ImageAsString.Substring(input.IndexOf('data:image/png;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. So function Convert.FromBase64String 只接受编码数据。因此,您需要提取编码数据。

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

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

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