c# - Base 64 解码失败,长度无效

标签 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('');
};

最佳答案

首先,更改您的 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');
}

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 - 3但是V < ei.length - 1 ,即V = ei.length - 3V = ei.length - 2您将在 V = ei.length 输入下一个迭代或V = ei.length + 1 ,此时ei[V], ei[V+1], ei[V+2]将是未定义

关于c# - Base 64 解码失败,长度无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23771884/

相关文章:

javascript - Angular:使用单个变量进行多个按钮操作

node.js - 使用 Nodejs 检索存储在 Mongodb 中的图像

c# - 获取 MailMessage 附件的路径

c# - 在任务完成之前关闭 WPF 窗口

javascript - 使用 jquery 函数时 Textchange 事件不起作用

javascript - Socket.io 在 ES6 类中发出值

android - 如何在kotlin android中将base64字符串转换为图像

asp.net - 在 Ruby 中重新实现 ASP.NET 成员资格和用户密码哈希

c# - 如果属性中有验证属性,为什么 Validator.TryValidateObject 不验证类?

C# 如何将字符串转换为类的实例?