【问题标题】:Conversion from Base 64 error从 Base 64 错误转换
【发布时间】:2017-11-01 21:26:45
【问题描述】:

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

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

然后出现异常 - System.FormatException 被捕获 Message=Invalid length for a Base-64 char array。

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

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);

这里出现异常 - System.FormatException 被捕获 Message=Invalid character in a Base-64 string。

“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”的地方

【问题讨论】:

  • 试试这个System.Text.Encoding.UTF8.GetString(b)
  • 可能是填充问题? en.wikipedia.org/wiki/Base64#Base64_table 说虽然理论上解码不需要它,但一些实现仍然坚持它。
  • 4&amp;&amp;":'1dgfa 的 Base64 应该是 NCYmIjonMWRnZmE=。解码你的在浏览器中给我[]4&amp;&amp;":'1dgfa[] 作为不可显示的字节值字符的替换),如果我应用 URL 编码,它显示为"%054%26...,所以你有一个05 字节值在您的 4 字符之前。这是否有意义,我想只有编码原始值的人才能告诉你。
  • 我只是在问@kingfisher 从哪里得到那个字符串。
  • 然后分享该代码。好像出了点问题。

标签: c# asp.net base64


【解决方案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

【讨论】:

  • 多次得到这类字符串
【解决方案2】:

您确定您从 base64 输出中获取了所有字符吗? 在字符串末尾附加“==”将使您的第一种方法正常工作。虽然输出开头有奇怪的字符。那么接下来的问题是:你确定是“ASCI”编码吗?

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 2014-06-08
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2015-08-09
    • 2013-03-05
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多