qq_42878769 2021-07-09 15:57 采纳率: 100%
浏览 150
已采纳

js中有没有类似java sun.misc.BASE64Decoder的Base64转字节数组

各位朋友,js中有没有类似java sun.misc.BASE64Decoder的Base64转字节数组的方式?

  • 写回答

6条回答 默认 最新

  • qq_42878769 2021-07-14 08:46
    关注
    if (!Shotgun)
        var Shotgun = {};
    if (!Shotgun.Js)
        Shotgun.Js = {};
    Shotgun.Js.Base64 = {
        _table: [
            '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', '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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
        ],
    
        encode: function (bin) {
            var codes = [];
            var un = 0;
            un = bin.length % 3;
            if (un == 1)
                bin.push(0, 0);
            else if (un == 2)
                bin.push(0);
            for (var i = 2; i < bin.length; i += 3) {
                var c = bin[i - 2] << 16;
                c |= bin[i - 1] << 8;
                c |= bin[i];
                codes.push(this._table[c >> 18 & 0x3f]);
                codes.push(this._table[c >> 12 & 0x3f]);
                codes.push(this._table[c >> 6 & 0x3f]);
                codes.push(this._table[c & 0x3f]);
            }
            if (un >= 1) {
                codes[codes.length - 1] = "=";
                bin.pop();
            }
            if (un == 1) {
                codes[codes.length - 2] = "=";
                bin.pop();
            }
            return codes.join("");
        },
        decode: function (base64Str) {
            var i = 0;
            var bin = [];
            var x = 0, code = 0, eq = 0;
            while (i < base64Str.length) {
                var c = base64Str.charAt(i++);
                var idx = this._table.indexOf(c);
                if (idx == -1) {
                    switch (c) {
                        case '=': idx = 0; eq++; break;
                        case ' ':
                        case '\n':
                        case "\r":
                        case '\t':
                            continue;
                        default:
                            throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u65E0\u6548\u7F16\u7801\uFF1A" + c };
                    }
                }
                if (eq > 0 && idx != 0)
                    throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };
    
                code = code << 6 | idx;
                if (++x != 4)
                    continue;
                bin.push(code >> 16);
                bin.push(code >> 8 & 0xff);
                bin.push(code & 0xff)
                code = x = 0;
            }
            if (code != 0)
                throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u6570\u636E\u957F\u5EA6\u9519\u8BEF" };
            if (eq == 1)
                bin.pop();
            else if (eq == 2) {
                bin.pop();
                bin.pop();
            } else if (eq > 2)
                throw { "message": "\u0062\u0061\u0073\u0065\u0036\u0034\u002E\u0074\u0068\u0065\u002D\u0078\u002E\u0063\u006E\u0020\u0045\u0072\u0072\u006F\u0072\u003A\u7F16\u7801\u683C\u5F0F\u9519\u8BEF\uFF01" };
    
    
            for (var i=0;i<bin.length;i++){
                if (bin[i]>=128){
                    bin[i]=bin[i]-256;
                }
            }
    
            return bin;
        }
    };
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 关注

    有的,你是要截图吗?还是做别的操作。

    评论
  • Jxnxn 2021-07-09 16:01
    关注

    window.btoa 和atob

    评论
  • Aganstrong 2021-07-10 18:20
    关注
    //字符串转byte[]
    function str2Bytes(str) {
        var ch, stack, result = [];
        for (var i = 0, len = str.length; i < len; i++) {
            ch = str.charCodeAt(i);
            stack = []; 
            do {
                if (ch >= 0x010000 && ch <= 0x10FFFF) {
                    stack.push(((ch >> 18) & 0x07) | 0xF0);
                    stack.push(((ch >> 12) & 0x3F) | 0x80);
                    stack.push(((ch >> 6) & 0x3F) | 0x80);
                    stack.push((ch & 0x3F) | 0x80);
                } else if (ch >= 0x000800 && ch <= 0x00FFFF) {
                    stack.push(((ch >> 12) & 0x0F) | 0xE0);
                    stack.push(((ch >> 6) & 0x3F) | 0x80);
                    stack.push((ch & 0x3F) | 0x80);
                } else if (ch >= 0x000080 && ch <= 0x0007FF) {
                    stack.push(((ch >> 6) & 0x1F) | 0xC0);
                    stack.push((ch & 0x3F) | 0x80);
                } else {
                    stack.push(ch & 0xFF);
                }
                ch = ch >> 8; 
            } while (ch);
            result = result.concat(stack.reverse());
        }
        return result;
    }
    
    //byte[]转string
    function bytes2Str(_arr) {
        var str = '';
        //字节序列转ASCII码
        //[0x24, 0x26, 0x28, 0x2A] ==> "$&C*"
        for (var i = 0, len = _arr.length; i < len; i++) {
            var one = _arr[i].toString(2),
            v = one.match(/^1+?(?=0)/);
            if (v && one.length == 8) {
                var bytesLength = v[0].length;
                var store = _arr[i].toString(2).slice(7 - bytesLength);
                for (var st = 1; st < bytesLength; st++) {
                    store += _arr[st + i].toString(2).slice(2);
                }
                str += String.fromCharCode(parseInt(store, 2));
                i += bytesLength - 1;
            } else {
                str += String.fromCharCode(_arr[i]);
            }
        }
        return str;
    }
    
    评论
  • Aganstrong 2021-07-12 16:55
    关注
    //int转byte
    function int2Byte(i) {
        var b = i & 0xFF; //[0-255]
        var c = 0;
        if (b >= 0x80) {
            c = b % 0x80;
            c = -1 * (0x80 - c);
        } else {
            c = b;
        }
        return c;
    }
    
    //字符串转byte[]
    function str2Bytes(str) {
        var ch, stack, result = [];
        for (var i = 0, len = str.length; i < len; i++) {
            ch = str.charCodeAt(i);
            stack = []; 
            if (ch >= 0x010000 && ch <= 0x10FFFF) {
                stack.push(int2Byte(((ch >> 18) & 0x07) | 0xF0));
                stack.push(int2Byte(((ch >> 12) & 0x3F) | 0x80));
                stack.push(int2Byte(((ch >> 6) & 0x3F) | 0x80));
                stack.push(int2Byte((ch & 0x3F) | 0x80));
            } else if (ch >= 0x000800 && ch <= 0x00FFFF) {
                stack.push(int2Byte(((ch >> 12) & 0x0F) | 0xE0));
                stack.push(int2Byte(((ch >> 6) & 0x3F) | 0x80));
                stack.push(int2Byte((ch & 0x3F) | 0x80));
            } else if (ch >= 0x000080 && ch <= 0x0007FF) {
                stack.push(int2Byte(((ch >> 6) & 0x1F) | 0xC0));
                stack.push(int2Byte((ch & 0x3F) | 0x80));
            } else {
                stack.push(ch & 0xFF);
            }
            result = result.concat(stack);
        }
        return result;
    }
    
    //byte[]转string
    function bytes2Str(_arr) {
        var unicodeStr = '';
        for (var pos = 0, len = _arr.length; pos < len;) {
            var flag = _arr[pos];
            var unicode = 0;
            if ((flag >>> 7) === 0) {
                unicodeStr += String.fromCharCode(_arr[pos]);
                pos += 1;
            } else if ((flag & 0xF0) === 0xF0) {
                unicode = (_arr[pos] & 0xF) << 18;
                unicode |= (_arr[pos + 1] & 0x3F) << 12;
                unicode |= (_arr[pos + 2] & 0x3F) << 6;
                unicode |= (_arr[pos + 3] & 0x3F);
                unicodeStr += String.fromCodePoint(unicode);
                pos += 4;
            } else if ((flag & 0xE0) === 0xE0) {
                unicode = (_arr[pos] & 0x1F) << 12;;
                unicode |= (_arr[pos + 1] & 0x3F) << 6;
                unicode |= (_arr[pos + 2] & 0x3F);
                unicodeStr += String.fromCharCode(unicode);
                pos += 3;
            } else if ((flag & 0xC0) === 0xC0) {
                unicode = (_arr[pos] & 0x3F) << 6;
                unicode |= (_arr[pos + 1] & 0x3F);
                unicodeStr += String.fromCharCode(unicode);
                pos += 2;
            } else {
                unicodeStr += String.fromCharCode(_arr[pos]);
                pos += 1;
            }
        }
        return unicodeStr;
    }
    
    var toBase64 = [
        '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',
        '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',
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
    ];
    
    var fromBase64 = new Array();
    for (var i = 0, len = 256; i < len; i++) {
        fromBase64[i] = -1;
    }
    for (var j = 0; j < toBase64.length; j++) {
        fromBase64[toBase64[j].charCodeAt(0)] = j;
    }
    fromBase64['='.charCodeAt(0)] = -2;
    
    //base64编码 string return byte[]
    function encodeBase64(src) {
        src = src || '';
        var bsrc = str2Bytes(src);
        var end = bsrc.length;
        var off = 0;
        var dst = [];
        var base64 = [];
        for (var i = 0, len = toBase64.length; i < len; i++) {
            base64[i] = toBase64[i].charCodeAt(0);
        }
        var sp = off;
        var slen = Math.trunc((end - off) / 3) * 3;
        var sl = off + slen;
        var dp = 0;
        while (sp < sl) {
            var sl0 = Math.min(sp + slen, sl);
            for (var sp0 = sp, dp0 = dp; sp0 < sl0;) {
                var bits = (bsrc[sp0++] & 0xff) << 16 | (bsrc[sp0++] & 0xff) << 8 | (bsrc[sp0++] & 0xff);
                dst[dp0++] = int2Byte(base64[(bits >>> 18) & 0x3f]);
                dst[dp0++] = int2Byte(base64[(bits >>> 12) & 0x3f]);
                dst[dp0++] = int2Byte(base64[(bits >>> 6) & 0x3f]);
                dst[dp0++] = int2Byte(base64[bits & 0x3f]);
            }
            var dlen = (sl0 - sp) / 3 * 4;
            dp += dlen;
            sp = sl0;
        }
        if (sp < end) {
            var b0 = bsrc[sp++] & 0xff;
            dst[dp++] = int2Byte(base64[b0 >> 2]);
            if (sp == end) {
                dst[dp++] = int2Byte(base64[(b0 << 4) & 0x3f]);
                dst[dp++] = '='.charCodeAt(0);
                dst[dp++] = '='.charCodeAt(0);
            } else {
                var b1 = bsrc[sp++] & 0xff;
                dst[dp++] = int2Byte(base64[(b0 << 4) & 0x3f | (b1 >> 4)]);
                dst[dp++] = int2Byte(base64[(b1 << 2) & 0x3f]);
                dst[dp++] = '='.charCodeAt(0);
            }
        }
        return dst;
    }
    
    //base64解码 string return byte[]
    function decodeBase64(src) {
        src = (src || '').replace(/[^A-z0-9+/]/g, '');
        var bsrc = str2Bytes(src);
        var sl = bsrc.length;
        var sp = 0;
        var dst = [];
        var base64 = fromBase64;
        var dp = 0;
        var bits = 0;
        var shiftto = 18; 
        while (sl > sp) {
            var b = bsrc[sp++] & 0xff;
            if ((b = base64[b]) < 0) {
                if (b == -2) { 
                    break;
                }
            }
            bits |= (b << shiftto);
            shiftto -= 6;
            if (shiftto < 0) {
                dst[dp++] = int2Byte(bits >> 16);
                dst[dp++] = int2Byte(bits >> 8);
                dst[dp++] = int2Byte(bits);
                shiftto = 18;
                bits = 0;
            }
        }
        if (shiftto == 6) {
            dst[dp++] = int2Byte(bits >> 16);
        } else if (shiftto == 0) {
            dst[dp++] = int2Byte(bits >> 16);
            dst[dp++] = int2Byte(bits >> 8);
        }
        return dst;
    }
    
    评论
  • qq_42878769 2021-07-14 08:45
    关注

    搞定了

    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 已采纳回答 7月14日
  • 创建了问题 7月9日

悬赏问题

  • ¥15 关于#tensorflow#的问题:有没有什么方法可以让机器自己学会像素风格的图片
  • ¥15 Oracle触发器字段变化时插入指定值
  • ¥15 docker无法进入容器内部
  • ¥15 qt https 依赖openssl 静态库
  • ¥15 python flask 报错
  • ¥15 改个密码引发的项目启动问题
  • ¥100 CentOS7单线多拨
  • ¥15 debian安装过程中老是出现无法将g21dr复制到g21dr怎么解决呀?
  • ¥15 如何用python实现跨工作簿的指定区域批量复制粘贴
  • ¥15 基于CH573f的雷迪安CR1400m通讯代码