我正在编写一个C#应用程序来解码这个字符串:
“ - W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 =”
当我将其复制/粘贴到此在线工具中时,它会起作用:https://www.base64decode.org
但是当我使用Convert.FromBase64String(str)
时,它会引发异常:
System.FormatException:输入不是有效的Base-64字符串 包含一个非基础64个字符,两个以上的填充字符,或 填充字符中的非法字符。
为什么?
答案 0 :(得分:12)
网址解码会从base64字符串中删除+
,使其无效。我没有理由拒绝投票给我指出它。阅读此问题的其他人将使用该代码并且存在缺陷。如果你解码'a + ==',结果将是字符'k'。如果您使用URL解码来解码'a + ==',则URL解码会将字符串转换为'a ==',并且您将尝试解码它。[/ p>
简而言之,.Net Framework使用的是Base64编码的变体,它不允许使用无效字符,并且该网站使用的PHP正在使用另一种允许无效字符但却丢弃它们的变体。
Base64编码将三个八位字节转换为四个编码字符。 Base64编码中64个字符中前62个的有效字符:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
有几种变体允许字符62和63使用不同的字符。对于C#,与最常见的变体一样,完整字符集为:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
https://msdn.microsoft.com/en-us/library/dhx0d524(v=vs.110).aspx
从零开始按升序排列的基数为64的数字为大写 字符“A”到“Z”,小写字母“a”到“z”, 数字“0”到“9”,符号“+”和“/”。没有价值 character,“=”,用于尾随填充。
已知此变体是RFC 3548或RFC 4648的标准“base64”编码,除非另有说明,否则禁止使用无效值。
PHP使用MIME的Base64传输编码(RFC 2045),它允许无效的字符但丢弃它们。
在所有其他Base64变体中,禁止使用无效字符。
如果原始Base64实际上应该包含-
字符,那么它使用的是另一种变体。
请参阅:https://en.wikipedia.org/wiki/Base64#Variants_summary_table
答案 1 :(得分: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);
答案 2 :(得分:0)
您必须像上面提到的那样从字符串中删除--
前缀。我想补充一点,当使用data:image/jpeg;base64,
时,在base64字符串中有Convert.FromBase64String(str)
前缀时,也会遇到相同的错误。
从字符串中删除data:image/jpeg;base64,
有用。