我正在尝试从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”
答案 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;编码