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

Dar*_*ius 9 c# base64

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

"--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 ="

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

但是当我使用它时抛出一个异常Convert.FromBase64String(str):

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

为什么?

Ale*_*ins 15

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

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

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
Run Code Online (Sandbox Code Playgroud)

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Run Code Online (Sandbox Code Playgroud)

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

从零开始的基数为64的数字是大写字母"A"到"Z",小写字母"a"到"z",数字"0"到"9",符号"+"和"/".无值字符"="用于尾随填充.

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

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

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

如果原始Base64实际上应该包含该-字符,则它使用不同的变体.

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

  • 是的,我花了3天终于找到了这个原因,因为我使用WebUtility.UrlDecode来包装base64图像数据。(URL 解码将从 Base64 字符串中删除 + 使其无效)是正确的,并且必须注意是否发布 Base64 数据。 (2认同)

Sae*_*eid 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);
Run Code Online (Sandbox Code Playgroud)