Base 64解码失败,长度无效

时间:2014-05-21 00:03:17

标签: c# javascript base64

我尝试使用C#代码转换从javascript代码生成的base64字符串,但我遇到了无效的长度消息。

字符串是MQA5ADIAMwA3ADgANwA6ADAA0

它应该转换回1923787:0

我尝试了一些在线解码器,其中一些有效,但有一对失败,同样的无效长度错误。我不会在这里发布链接,但不用说他们能够将它转换回预期的字符串。

C#解码

var t = "MQA5ADIAMwA3ADgANwA6ADAA0";
var x = Convert.FromBase64String(t);

Javascript编码器:

var encoder = function (mL) {
    if (!mL || mL === '') {
        return '';
    }
    var ei = [];
    var V;
    for (V = 0; V < mL.length; V++) {
        ei.push(mL.charCodeAt(V) % 256);
        ei.push(Math.floor(mL.charCodeAt(V) / 256));
    }
    ei.push(0);
    ei.push(0);
    var sf = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
    var gF = [],
        hO;
    for (V = 0; V < ei.length - 1; V += 3) {
        hO = ei[V] * 0x10000 + ei[V + 1] * 0x100 + ei[V + 2];
        gF.push(sf.charAt(Math.floor(hO / 0x40000)));
        gF.push(sf.charAt(Math.floor(hO / 0x1000) % 0x40));
        gF.push(sf.charAt(Math.floor(hO / 0x40) % 0x40));
        gF.push(sf.charAt(hO % 0x40));
    }
    var vr = Math.ceil(mL.length * 16 / 6);
    while (gF.length > vr) {
        gF.pop();
    }
    if ((gF.length % 4) === 3) {
        gF.push('1');
    } else if ((gF.length % 4) === 2) {
        gF.push('2');
    } else if ((gF.length % 4) === 0) {
        gF.push('0');
    }
    return gF.join('');
};

4 个答案:

答案 0 :(得分:2)

首先,将编码的for更改为

for (V = 0; V < ei.length - 3; V += 3) {

然后代替

var vr = Math.ceil(mL.length * 16 / 6);
while (gF.length > vr) {
    gF.pop();
}
if ((gF.length % 4) === 3) {
    gF.push('1');
} else if ((gF.length % 4) === 2) {
    gF.push('2');
} else if ((gF.length % 4) === 0) {
    gF.push('0');
}

DO

switch (ei.length % 3) {
    case 0:
        break;
    case 1:
        gF[gF.length - 2] = '=';
    case 2:
        gF[gF.length - 1] = '=';
        break;
}

现在你会得到

encoder("1923787:0"); // "MQA5ADIAMwA3ADgANwA6ADA="

哪个是有效的 Base64

发生了什么事? Base64 使用=来指定我们开始使用的字节数,就我们从3的下一个倍数来说有多短,所以这会交换最终字符(这些=符号由于没有任何位而为零符号。

对循环的修改是在正确的位置结束循环 - 你只是- 1过度,因为你说你在V >= ei.length - 3V < ei.length - 1,即V = ei.length - 3V = ei.length - 2您将在V = ei.lengthV = ei.length + 1进入下一次迭代,此时ei[V], ei[V+1], ei[V+2]未定义

答案 1 :(得分:0)

看看这是否有帮助。

string x = Encoding.UTF8.GetString(Convert.FromBase64String("MQA5ADIAMwA3ADgANwA6ADAA0"));

链接:How do I decode a base64 encoded string?

答案 2 :(得分:0)

您的编码例程在字符串的末尾添加了一个额外的0,删除它并且解码将工作(转换为Unicode字符串)

示例代码:

var original = "1923787:0";
var bytesFromOriginal = System.Text.Encoding.Unicode.GetBytes(original);
var base64string = Convert.ToBase64String(bytesFromOriginal);

base64string = "MQA5ADIAMwA3ADgANwA6ADAA";
var bytesFromEncodedString = Convert.FromBase64String(base64string);
var decodedString = System.Text.Encoding.Unicode.GetString(bytesFromEncodedString);

答案 3 :(得分:0)

输入字符串的正确Base64编码为“MQA5ADIAMwA3ADgANwA6ADAA” - 没有显示的尾随零。出于某种原因,您的javascript代码正在添加零。我不知道为什么。但这使它成为无效的字符串。

我猜测填充,应该是'='被javascript算法添加为'0'。只是一个想法。