【问题标题】:Javascript atob(str) equivilent in c#c# 中等效的 Javascript atob(string)
【发布时间】:2014-08-12 09:10:24
【问题描述】:

我这样做了:

 byte[] data = Convert.FromBase64String(str);
 string decodedString = Encoding.UTF8.GetString(data);
 Console.WriteLine(decodedString);

但是得到了Unhandled Exception: System.FormatException: Invalid length for a Base-64 char array or string.

在javascript中使用atob(str)给了我正确的解码str。

javascript 控制台:

atob("eyJpc3MiOiJodHRwczovL2lkZW50aXR5LXN0YWdpbmcuYXNjZW5kLnh5eiIsImF1ZCI6Imh0dHBzOi8vaWRlbnRpdHktc3RhZ2luZy5hc2NlbmQueHl6L3Jlc291cmNlcyIsImNsaWVudF9pZCI6IjY5OTRBNEE4LTBFNjUtNEZFRC1BODJCLUM2ODRBMEREMTc1OCIsInNjb3BlIjpbIm9wZW5pZCIsInByb2ZpbGUiLCJzdWIucmVhZCIsImRhdGEud3JpdGUiLCJkYXRhLnJlYWQiLCJhbGcuZXhlY3V0ZSJdLCJzdWIiOiIzNzdjMDk1Yi03ODNiLTQ3ZTctOTdiMS01YWVkOThjMDM4ZmMiLCJhbXIiOiJleHRlcm5hbCIsImF1dGhfdGltZSI6MTQwNzYxNTUwNywiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMDg0MGM3NjAtNmY3Yi00NTU2LWIzMzctOGMwOTBlMmQ0NThkLyIsIm5hbWUiOiJwa3NAYXNjZW5kLnh5eiIsImV4cCI6MTQwNzgzNjcxMSwibmJmIjoxNDA3ODMzMTExfQ")
"{"iss":"https://identity-staging.ascend.xyz","aud":"https://identity-staging.ascend.xyz/resources","client_id":"6994A4A8-0E65-4FED-A82B-C684A0DD1758","scope":["openid","profile","sub.read","data.write","data.read","alg.execute"],"sub":"377c095b-783b-47e7-97b1-5aed98c038fc","amr":"external","auth_time":1407615507,"idp":"https://sts.windows.net/0840c760-6f7b-4556-b337-8c090e2d458d/","name":"pks@ascend.xyz","exp":1407836711,"nbf":1407833111}"

【问题讨论】:

  • 什么是parts?一个字符串数组?
  • 我将更新问题以省略它。是的,它是一个数组。部分 [1] 与我在 javascript 中测试的字符串相同
  • 字符串是怎么定义的,你确定字符串被正确转义了吗?
  • 我只是将我在 javascript 中测试过的相同字符串复制粘贴到 c# 代码中。 str = "my_jwt_token";将再次更新问题以显示代码

标签: c# javascript


【解决方案1】:
    var str = "eyJpc3MiOiJodHRwczovL2lkZW50aXR5LXN0YWdpbmcuYXNjZW5kLnh5eiIsImF1ZCI6Imh0dHBzOi8vaWRlbnRpdHktc3RhZ2luZy5hc2NlbmQueHl6L3Jlc291cmNlcyIsImNsaWVudF9pZCI6IjY5OTRBNEE4LTBFNjUtNEZFRC1BODJCLUM2ODRBMEREMTc1OCIsInNjb3BlIjpbIm9wZW5pZCIsInByb2ZpbGUiLCJzdWIucmVhZCIsImRhdGEud3JpdGUiLCJkYXRhLnJlYWQiLCJhbGcuZXhlY3V0ZSJdLCJzdWIiOiIzNzdjMDk1Yi03ODNiLTQ3ZTctOTdiMS01YWVkOThjMDM4ZmMiLCJhbXIiOiJleHRlcm5hbCIsImF1dGhfdGltZSI6MTQwNzYxNTUwNywiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvMDg0MGM3NjAtNmY3Yi00NTU2LWIzMzctOGMwOTBlMmQ0NThkLyIsIm5hbWUiOiJwa3NAYXNjZW5kLnh5eiIsImV4cCI6MTQwNzgzNjcxMSwibmJmIjoxNDA3ODMzMTExfQ";
    int mod4 = str.Length % 4;
    if (mod4 > 0)
    {
        str += new string('=', 4 - mod4);
    }

用c#解决了

【讨论】:

  • 我需要在编码和解码端都使用它吗?还是只是解码?
  • 仅用于解码,由于base64字符串可以省略末尾的==,但c#期望长度可以被4整除(因此末尾经常==)。跨度>
  • 这修复了损坏的编码输入字符串,例如 fC4wMDI0MDIyNYMyNTczRIrXALxhHLMzMx,并将其转换为有效的编码 fC4wMDI0MDIyNYMyNTczRIrXALxhHLMzMx==。现在我可以使用System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(encoedString))
【解决方案2】:

使用 javascript 的 window.btoa 函数在 Javascript 前端 UI 中以 Base 64 格式对字符串进行编码。要在 C# 中解码回相同的字符串(相当于 javascript 的 window.atob 函数),请参阅以下代码。

(很可能您正在尝试将数据(大多数情况下是 HTML,因为它需要 btoa 编码以确保最佳兼容性))回发到控制器,或者您可能会在服务器端创建自定义基本基本身份验证过滤器)

string base64Encoded = "YmFzZTY0IGVuY29kZWQgc3RyaW5n";
string base64Decoded;
byte[] data = System.Convert.FromBase64String(base64Encoded);
base64Decoded = System.Text.ASCIIEncoding.ASCII.GetString(data);
Console.WriteLine(base64Decoded)

您可以在https://dotnetfiddle.net/abxwSw查看其工作示例

【讨论】:

  • 谢谢!它的工作就像一个魅力......谢谢
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2021-11-26
  • 2014-05-26
相关资源
最近更新 更多