Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Convert.FromBase64String在代码中不起作用,但在联机工具中起作用_C#_Base64 - Fatal编程技术网

C# Convert.FromBase64String在代码中不起作用,但在联机工具中起作用

C# Convert.FromBase64String在代码中不起作用,但在联机工具中起作用,c#,base64,C#,Base64,我正在编写一个C#应用程序来解码这个字符串: "--2.中国政府对其进行了一些研究。2.中国政府对其进行了一些研究。他们对其进行了一些研究,并通过一些研究,他们对他们进行了一些研究,他们对他们进行了一些研究,他们对他们的研究。他们对他们的研究。他们对他们进行了一些研究。他们对他们的研究,他们对他们的研究,他们对他们的研究,他们对他们的研究,他们对他们的研究,他们在他们的研究,他们在他们的研究,他们的研究他们在他们对他们的研究,他们的研究他们在他们的研究他们在他们的2 2 2 2 2 2 2 2

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

"--2.中国政府对其进行了一些研究。2.中国政府对其进行了一些研究。他们对其进行了一些研究,并通过一些研究,他们对他们进行了一些研究,他们对他们进行了一些研究,他们对他们的研究。他们对他们的研究。他们对他们进行了一些研究。他们对他们的研究,他们对他们的研究,他们对他们的研究,他们对他们的研究,他们对他们的研究,他们在他们的研究,他们在他们的研究,他们的研究他们在他们对他们的研究,他们的研究他们在他们的研究他们在他们的2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2的研究他们对他们的研究他们对他们的研究他们的研究他们的研究他们对他们的研究,他们的研究他们的研究,他们对他们的研究他们的研究他们对他们的研究他们的研究他们的研究他们的研究,他们对他们的研究他们的研究,他们的研究他们的研究,他们的研究他们的研究他们的研究。6 6 6 6 6 6 VYLxNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0=”

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

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

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


为什么?

您的代码不是有效的Base64字符串。字符串开头的-字符无效。您可以通过这种方式转换它

using System;
using System.Text;

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

URL解码将从base64字符串中删除
++
,使其无效。没有理由反对我指出它。其他阅读此问题的人将使用该代码,它是有缺陷的。如果您解码“a++=”,结果将是字符“k”。如果您使用URL解码解码“a++=”,URL解码将使字符串变为“a”=='您将在尝试解码时遇到异常

简而言之,.Net Framework使用的是Base64编码的一个变体,它不允许使用无效字符,而相关站点使用的PHP使用的是另一个变体,它允许使用无效字符,但会丢弃这些字符

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

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

从零开始按升序排列的基64位为大写 字符“A”至“Z”,小写字符“A”至“Z”,以及 数字“0”至“9”,以及符号“+”和“/”。无值 字符“=”用于尾随填充

已知该变体是RFC 3548或RFC 4648的标准“base64”编码,其中禁止使用无效值,除非另有规定

PHP对MIME使用Base64传输编码(RFC 2045),该编码允许使用无效字符,但会丢弃这些字符

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

如果原来的Base64实际上应该包含
-
字符,那么它使用的是不同的变体


请参阅:

您必须从字符串中删除
--
前缀,如上文所述。我想补充的是,当我使用
转换.FromBase64String(str)
时,在我的base64字符串中有
图像/jpeg;base64,
前缀时,我遇到了相同的错误


从字符串中删除
数据:image/jpeg;base64,

删除“--“这篇文章也许能回答你的问题@大流士不,不是。这是标题或其他内容,不在
a-Z0-9
范围内,它们不应该有效。它可能在base64decode.org上运行,因为该网站正在解码之前删除它们。您可以看到,如果添加或删除更多减号,输出将保持不变。+is,-is not Net使用base64变量,其中
-
是不允许的字符。是的,我最终花了3天时间找出了这个原因,因为我使用WebUtility.UrlDecode包装base64图像数据。(URL解码将从base64字符串中删除+使其无效)是正确的,并且必须知道post base64数据是否正确。