【问题标题】:base64 encoding of byte array in javascriptjavascript中字节数组的base64编码
【发布时间】:2016-05-04 18:58:39
【问题描述】:

我试图弄清楚如何对我正在使用的脚本进行反向编码。我有解码功能。我现在必须创建编码函数,我有点挣扎,详细说明

"chr2 = (enc2 >> 2) | ((enc3 & 0x0F) << "

我不确定这到底意味着什么,或者如何确保正确填充编码数据。

我正在使用 decodeAsArray 函数将其转换为字节数组,并且效果很好。现在只是想反之亦然,以相反的方式对 base64 进行编码,所以我希望创建一个 encodeFromArray 函数,在其中我将一个字节数组作为函数的输入。

Base64 = {
        _keyStr: ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+=",
        decode: function( input ) {
                    var output = "";
                    var hex = "";
                    var chr1, chr2, chr3 = "";
                    var enc1, enc2, enc3, enc4 = "";
                    var i = 0;
                    var base64test = /[^A-Za-z0-9\+\.\=]/g;

                    do {
                        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 | ((enc2 & 3) << 6));                                                                                                             
                        chr2 = (enc2 >> 2) | ((enc3 & 0x0F) << 4);                                                                                                     
                        chr3 = (enc3 >> 4) | (enc4 << 2);


                        output = output + String.fromCharCode(chr1);
                        if (enc3 != 64) {
                            output = output + String.fromCharCode(chr2);
                        }
                        if (enc4 != 64) {
                            output = output + String.fromCharCode(chr3);
                        }
                        chr1 = chr2 = chr3 = "";
                        enc1 = enc2 = enc3 = enc4 = "";
                    } while (i < input.length);

                    return (output);
                },

    decodeAsArray: function (b) {
        var d = this.decode(b),
            a = [],
            c;
        for (c = 0; c < d.length; c++) {
            a[c] = d.charCodeAt(c)
        }
        return a
    }

我认为它看起来像下面这样:

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


    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;
}

但是,我不确定 enc2、enc3 和 enc4 应该如何,基于 decode 函数,然后我也不确定如何从字节数组中做到这一点

【问题讨论】:

  • 您的具体问题是什么?
  • 如何根据给定的解码函数对字节数组进行base64编码...
  • 这里有很多关于如何在JS中进行base64编码和解码的问题。其中一些列在相关侧边栏中。
  • 这些都没有告诉我如何编码,基于我给出的解码功能......
  • 为什么一定要基于你的解码函数?任何 base64 编码器都应该是等效的。

标签: javascript encoding base64 bytearray


【解决方案1】:

将原始编码视为这些位。每个编码的前 2 位是00,因为 base64 编码只有 63 个字符,并且只需要 6 位。

enc1 = 00abcdef
enc2 = 00ghijkl
enc3 = 00mnopqr
enc4 = 00stuvwx

然后位移产生:

chr1 = (enc1 | ((enc2 & 3) << 6)) = 00abcdef | 000000kl << 6         = klabcdef                                                   
chr2 = (enc2 >> 2) | ((enc3 & 0x0F) << 4) = 0000ghij | 0000opqr << 4 = opqrghij                                                                                                   
chr3 = (enc3 >> 4) | (enc4 << 2) = 000000mn | stuvwx00               = stuvwxmn

所以要扭转它,你需要这样做:

enc1 = chr1 & 0x3F;
enc2 = ((chr2 & 0x0F) << 2) | (chr1 >> 6);
enc3 = ((chr3 & 0x03 << 4) | (chr2 >> 4);
enc4 = chr3 >> 2;

所以看起来你有正确的公式,但你是在倒退——你的enc1实际上是enc4

【讨论】:

  • 嗨 Barmar,想知道解码函数的反面是什么?解码功能是否适用于 4 位代码?
  • 只需在循环中进行这些位移,将结果连接成一个字符串。
  • 糟糕,我刚刚意识到我展示的是您提出的编码功能的反面,而不是原始解码功能的反面。我需要重做答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多