我尝试使用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('');
};
答案 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 - 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]
将未定义
答案 1 :(得分:0)
看看这是否有帮助。
string x = Encoding.UTF8.GetString(Convert.FromBase64String("MQA5ADIAMwA3ADgANwA6ADAA0"));
答案 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'。只是一个想法。