从Base 64转换错误

时间:2017-11-01 12:24:26

标签: c# asp.net base64

我正在尝试从Base64字符串转换。首先我尝试了这个:

string a = "BTQmJiI6JzFkZ2ZhY";
byte[] b = Convert.FromBase64String(a);
string c = System.Text.Encoding.ASCII.GetString(b);

然后得到异常 - 捕获了System.FormatException Message = Base-64 char数组的长度无效。

所以在谷歌搜索之后,我尝试了这个:

string a1 = "BTQmJiI6JzFkZ2ZhY";
int mod4 = a1.Length % 4;
if (mod4 > 0)
{
    a1 += new string('=', 4 - mod4);
}
byte[] b1 = Convert.FromBase64String(a1);
string c1 = System.Text.Encoding.ASCII.GetString(b1);

这里我得到了异常 - 在Base-64字符串中捕获了System.FormatException Message = Invalid字符。

“BTQmJiI6JzFkZ2ZhY”中是否有无效字符?或者是长度问题?

编辑:我首先使用以下代码解密输入字符串:

string sourstr, deststr,strchar;
int strlen;
decimal ascvalue, ConvValue;

deststr = "";
sourstr = "InputString";
strlen = sourstr.Length;

for (int intI = 0; intI <= strlen - 1; intI++)
{
    strchar = sourstr.Substring(intI, 1);
    ascvalue = (decimal)strchar[0];
    ConvValue = (decimal)((int)ascvalue ^ 85);

    if ((char)ConvValue.ToString().Length == 0)
    {
        deststr = deststr + strchar;
    }
    else
    {
        deststr = deststr + (char)ConvValue;
    }
}

此输出deststr传递给下面的代码

Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(deststr));

这是我得到的地方“BTQmJiI6JzFkZ2ZhY”

2 个答案:

答案 0 :(得分:1)

您不能通过编码整个字节数来获得这样的base64字符串。在编码时,每3个字节表示为4个字符,因为3个字节是24位,每个base64字符是6位(2 ^ 6 = 64),因此其中4个也是24位。如果要编码的字节数不能除以3 - 您还剩下一些字节。你可以剩下2或1个字节。

如果剩下2个字节 - 这是16位,你需要至少3个字符来编码(2个字符只有12位 - 不够)。因此,如果你剩下2个字节 - 你用3个字符对它们进行编码并应用“=”填充。

如果剩下1个字节 - 那是8位。你需要至少2个字符。您编码为2个字符并应用“==”填充。

请注意,无法将某些内容编码为一个字符(因此没有“===”填充)。

你的字符串可分为4个字符块:“BTQm”,“JiI6”,“JzFk”,“Z2Zh”,“Y”。 4个第一个块表示3个字节,但“Y”代表什么?谁知道。你可以说它代表0-63范围内的1个字节,但是从上面你可以看到它不是如何工作的,所以要解释它就像你必须自己做的那样。

从上面你可以看到你不能得到长度为17的base64字符串(没有填充)。你可以得到16岁,18岁,19岁,20岁,但从来没有17岁

答案 1 :(得分:0)

你确定你从base64输出中获取了所有字符吗? 追加&#34; ==&#34;在字符串的末尾将使您的第一个方法工作没有任何问题。虽然在输出的开头有奇怪的字符。所以下一个问题是:你确定它是&#34; ASCI&#34;编码