2017-07-02 76 views
1

工作我写一个C#应用程序添加到该字符串解码:Convert.FromBase64String不代码工作,但在在线工具

“--W3sic3RhcnRfdGltZSI6IjAiLCJwcm9kdWN0X2lkIjoiODQwMDMzMDQiLCJ1cmwiOiIifSx7InN0YXJ0X3RpbWUiOiI3OSIsInByb2R1Y3RfaWQiOiI4NDAzNjk2MSIsInVybCI6IiJ9LHsic3RhcnRfdGltZSI6IjgyIiwicHJvZHVjdF9pZCI6Ijg0MDAzMDIwIiwidXJsIjoiIn0seyJzdGFydF90aW1lIjoiMTA5IiwicHJvZHVjdF9pZCI6IiIsInVybCI6Imh0dHBzOi8vYmxvZy5sYXJlaW5lZHVzaG9wcGluZy5jYS8yMDE3LzAxL3RyYW5zZm9ybWVyLXNlcy12aWV1eC1nYW50cy1kZS1jdWlyLWVuLTUtbWludXRlcy8ifV0 =”

它的工作原理,当我复制/粘贴它这个在线工具:

System.FormatException:https://www.base64decode.org

但是当我使用Convert.FromBase64String(str)它抛出一个异常的输入是不是有效的Base-64字符串,因为它含有 非基础最多64个字符,多于两个填充字符,或者在填充字符中存在非法字符 。

为什么?

+2

删除 “ - ” – Parker

+0

为什么呢?这是有效的Base64字符 – Darius

+1

这篇文章可能会回答你的问题。 https://stackoverflow.com/questions/15114044/the-input-is-not-a-valid-base-64-string-as-it-contains-a-non-base-64-character – EntryLeveDeveloper

回答

4

URL解码将从base64字符串中删除+使其无效。没有理由投票给我指出它。其他人阅读这个问题将使用该代码,它是有缺陷的。如果解码'a + ==',结果将是字符'k'。如果使用URL Decoding解码'a + ==',则URL解码会将字符串转换为'a ==',您将尝试解码该异常。

简而言之,.Net框架正在使用Base64编码的变体,该变体不允许无效字符,并且该网站使用的PHP正在使用允许无效字符丢弃的另一种变体。

Base64编码将三个八位字节转换为四个编码字符。有效字符用于Base64编码的64个字符的第一个62:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

有几种变体,其允许字符62和63在C#不同的字符,如最常见的变体中,完整的字符集是:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/= 

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

基部-64以升序从数字零是大写 字符 “A” 到 “Z” 中,LO wercase字符“a”到“z”, 数字“0”到“9”以及符号“+”和“/”。无价值的 字符“=”用于结尾填充。

此变种已知是针对RFC 3548或RFC 4648标准的“base64”编码,除非另有说明,否则无效值将被禁止。

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

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

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

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

3

您的代码不是有效的Base64字符串。字符串开头的 - 字符无效。你可以这样转换它。

using System; 
using System.Text; 

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

Net使用base64变体,其中'-'不是允许的字符。 –

相关问题