我尝试使用 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 - 3
或V = 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/