base64 和 url base64 和 encodeURIComponent

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了base64 和 url base64 和 encodeURIComponent相关的知识,希望对你有一定的参考价值。

参考技术A

可以看出,非url base64不会对斜杠进行编码。
准确的说:url base64 会将 +和/分别替换为- _两个字符

假设是路径参数: http://a.com/aHR0cDovL2EuY29tL2M/YT0zJmM9MzQ= 这样传输肯定是后端解析不到完整的路径参数,所以要使用urlsafe_b64encode。

假设是url查询参数, http://a.com?c=aHR0cDovL2EuY29tL2M/YT0zJmM9MzQ= 和 http://a.com?c=aHR0cDovL2EuY29tL2M_YT0zJmM9MzQ 后端也肯定是可以正常解析的

当前端需要传递一个查询参数带有特殊字符的时候,可以使用encodeURIComponent,后端Flask能够正常解析出,明文传输会导致解析出来参数不完整

此处如果不使用encodeURIComponent编码会导致 callback_url= http://a.com/c?a=3&c=34 后端解析到参数是callback_url: http://a.com/c?a=3

py 解析encodeURIComponent

js urlsafe_b64encode

字符串加密解密(Base64)

var Base64 = {

// private property
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

// public method for encoding
encode: function(input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;

input = Base64._utf8_encode(input);

while (i < input.length) {

chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);

enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;

if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}

output = output + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

}

return output;
},

// public method for decoding
decode: function(input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;

input = input.replace(/[^A-Za-z0-9+/=]/g, "");

while (i < input.length) {

enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));

chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;

output = output + String.fromCharCode(chr1);

if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}

}

output = Base64._utf8_decode(output);

return output;

},

// private method for UTF-8 encoding
_utf8_encode: function(string) {
string = string.replace(/ /g, " ");
var utftext = "";

for (var n = 0; n < string.length; n++) {

var c = string.charCodeAt(n);

if (c < 128) {
utftext += String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}

}

return utftext;
},

// private method for UTF-8 decoding
_utf8_decode: function(utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;

while (i < utftext.length) {

c = utftext.charCodeAt(i);

if (c < 128) {
string += String.fromCharCode(c);
i++;
} else if ((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i + 1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
} else {
c2 = utftext.charCodeAt(i + 1);
c3 = utftext.charCodeAt(i + 2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}

}

return string;
}

}

用法:
    var a = Base64.encode(str);
    var b = Base64.decode(a);




































































































































以上是关于base64 和 url base64 和 encodeURIComponent的主要内容,如果未能解决你的问题,请参考以下文章

powershell -enc参数无法解码base64编码payload的解决方案

微信小程序-Base64 加解密

字符串加密解密(Base64)

怎么用js写自定义key的base64加密

css怎样将base64编码转为字体

Base64和Base64Url