首页 Javascript 正文
516

javascript实现base32解码(UTF8)

  • yiqingpeng
  • 2019-04-02
  • 0
  •  
本函数仅针对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;
}

正在加载评论...