作者:kuae_617 | 来源:互联网 | 2023-01-30 17:40
我正在编写一个C#应用程序来解码这个字符串:
"--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 ="
当我将其复制/粘贴到此在线工具中时,它可以工作:https://www.base64decode.org
但是当我使用它时抛出一个异常Convert.FromBase64String(str)
:
System.FormatException:输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符.
为什么?
1> Alexander Hi..:
URL解码将从+
base64字符串中删除,使其无效.我没有理由拒绝投票给我指出它.阅读此问题的其他人将使用该代码并且存在缺陷.如果你解码'a + ==',结果将是字符'k'.如果您使用URL解码来解码'a + ==',则URL解码会将字符串转换为'a ==',并且您将尝试解码它.
简而言之,.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",符号"+"和"/".无值字符"="用于尾随填充.
已知此变体是RFC 3548或RFC 4648的标准"base64"编码,除非另有说明,否则禁止使用无效值.
PHP使用MIME(RFC 2045)的Base64传输编码,它允许无效字符但丢弃它们.
在所有其他Base64变体中,禁止使用非有效字符.
如果原始Base64实际上应该包含该-
字符,则它使用不同的变体.
请参阅:https://en.wikipedia.org/wiki/Base64#Variants_summary_table
2> Saeid..:
您的代码不是有效的Base64字符串. - 字符串开头的 - 字符无效.你可以这样转换它.
using System;
using System.Text;
var decodedString = "--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0="
.Replace("-", "");
var bytes = Convert.FromBase64String(decodedString);
var encodedString = Encoding.UTF8.GetString(bytes);
Console.WriteLine(encodedString);