本函数仅针对utf8字符串的base32解码。
function base32Decode(encodedStr){
encodedStr = encodedStr.replace(/\=+?$/g, '');
var base32Table = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"2", "3", "4", "5", "6", "7"];
var intCode = function (chr){return base32Table.indexOf(chr.toUpperCase());};
var toBinary = function (dec){return dec.toString(2);};
var toDec = function (binStr){return parseInt(binStr, 2);};
var strlen = encodedStr.length, pos = 0;
var binStr = '', bytes = [];
while (pos < strlen) {
binStr += toBinary(intCode(encodedStr[pos])).padStart(5, '0');//将索引转为二进制串,补足5位。
pos++;
if (binStr.length < 8) { //小于8位长度则继续往下拼接。
continue;
}
bytes.push(toDec(binStr.substring(0, 8)));//取8位二进制字符串转为整数。
binStr = binStr.substring(8);//余下的二进制串作为下一次拼接的开始串。
}
var toAsciiStr = function (bytesArray){
//Only for ASCII characters converting.
var str = '';
while (bytesArray.length > 0 ) {
//String.fromCharCode() parameters sequence should be less than 65535
str += String.fromCharCode.apply(null, bytesArray.splice(0,65535));
}
return str;
}
//return toAsciiStr(bytes);
return stringFromUTF8Array(bytes);
}
Bytes转utf8字符串
/**
* 本函数来源于网络
*/
function stringFromUTF8Array(data){
var extraByteMap = [ 1, 1, 1, 1, 2, 2, 3, 0 ];
var count = data.length;
var str = "";
for (var index = 0;index < count;) {
var ch = data[index++];
if (ch & 0x80) {
var extra = extraByteMap[(ch >> 3) & 0x07];
if (!(ch & 0x40) || !extra || ((index + extra) > count)) return null;
ch = ch & (0x3F >> extra);
for (;extra > 0;extra -= 1) {
var chx = data[index++];
if ((chx & 0xC0) != 0x80) return null;
ch = (ch << 6) | (chx & 0x3F);
}
}
str += String.fromCharCode(ch);
}
return str;
}