js的base32、base64編碼方法實現(xiàn)

前言

由于業(yè)務(wù)需要涮俄,項目中涉及各種格式的編碼解碼實現(xiàn)蛉拙,base32、base64網(wǎng)上大部分的博客文章出處都一致彻亲,但是都有小問題孕锄。如不兼容漢字轉(zhuǎn)碼、base32未進行補“=”操作的此類問題苞尝。然后自己通過網(wǎng)上已有的方法進行了改造畸肆,并通過測試比對,請放心使用宙址。

一轴脐、js封裝的方法源碼

代碼如下:

const Base64 = {
            _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
            encode: function (e) {
                var t = "";
                var n, r, i, s, o, u, a;
                var f = 0;
                e = Base64._utf8_encode(e);
                while (f < e.length) {
                    n = e.charCodeAt(f++);
                    r = e.charCodeAt(f++);
                    i = e.charCodeAt(f++);
                    s = n >> 2;
                    o = (n & 3) << 4 | r >> 4;
                    u = (r & 15) << 2 | i >> 6;
                    a = i & 63;
                    if (isNaN(r)) {
                        u = a = 64
                    } else if (isNaN(i)) {
                        a = 64
                    }
                    t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
                }
                return t
            },
            decode: function (e) {
                var t = "";
                var n, r, i;
                var s, o, u, a;
                var f = 0;
                e = e.replace(/[^A-Za-z0-9+/=]/g, "");
                while (f < e.length) {
                    s = this._keyStr.indexOf(e.charAt(f++));
                    o = this._keyStr.indexOf(e.charAt(f++));
                    u = this._keyStr.indexOf(e.charAt(f++));
                    a = this._keyStr.indexOf(e.charAt(f++));
                    n = s << 2 | o >> 4;
                    r = (o & 15) << 4 | u >> 2;
                    i = (u & 3) << 6 | a;
                    t = t + String.fromCharCode(n);
                    if (u != 64) {
                        t = t + String.fromCharCode(r)
                    }
                    if (a != 64) {
                        t = t + String.fromCharCode(i)
                    }
                }
                t = Base64._utf8_decode(t);
                return t
            },
            _utf8_encode: function (e) {
                e = e.replace(/rn/g, "n");
                var t = "";
                for (var n = 0; n < e.length; n++) {
                    var r = e.charCodeAt(n);
                    if (r < 128) {
                        t += String.fromCharCode(r)
                    } else if (r > 127 && r < 2048) {
                        t += String.fromCharCode(r >> 6 | 192);
                        t += String.fromCharCode(r & 63 | 128)
                    } else {
                        t += String.fromCharCode(r >> 12 | 224);
                        t += String.fromCharCode(r >> 6 & 63 | 128);
                        t += String.fromCharCode(r & 63 | 128)
                    }
                }
                return t
            },
            _utf8_decode: function (e) {
                var t = "";
                var n = 0;
                var r = c1 = c2 = 0;
                while (n < e.length) {
                    r = e.charCodeAt(n);
                    if (r < 128) {
                        t += String.fromCharCode(r);
                        n++
                    } else if (r > 191 && r < 224) {
                        c2 = e.charCodeAt(n + 1);
                        t += String.fromCharCode((r & 31) << 6 | c2 & 63);
                        n += 2
                    } else {
                        c2 = e.charCodeAt(n + 1);
                        c3 = e.charCodeAt(n + 2);
                        t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
                        n += 3
                    }
                }
                return t
            }
        }

        //  字符串轉(zhuǎn)base64位的編碼格式方法
        function stringToBase64(srcString){
            if (!srcString) {
                return '';
            }
            return Base64.encode(srcString);
        }

        //  字符串轉(zhuǎn)base32位的編碼格式方法
        function stringToBase32(srcString) {
            if (!srcString) {
                return '';
            }

            let BASE32CHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
            let i = 0;
            let index = 0;
            let digit = 0;
            let currByte;
            let nextByte;
            let retrunString = '';
            // 先進行utf8編碼,否則中文的字符串轉(zhuǎn)碼有問題
            srcString = Base64._utf8_encode(srcString);

            for (let i = 0; i < srcString.length;) {
                currByte = (srcString.charCodeAt(i) >= 0) ? srcString.charCodeAt(i)
                    : (srcString.charCodeAt(i) + 256);

                if (index > 3) {
                    if ((i + 1) < srcString.length) {
                        nextByte = (srcString.charCodeAt(i + 1) >= 0)
                            ? srcString.charCodeAt(i + 1)
                            : (srcString.charCodeAt(i + 1) + 256);
                    } else {
                        nextByte = 0;
                    }

                    digit = currByte & (0xFF >> index);
                    index = (index + 5) % 8;
                    digit <<= index;
                    digit |= (nextByte >> (8 - index));
                    i++;
                } else {
                    digit = (currByte >> (8 - (index + 5))) & 0x1F;
                    index = (index + 5) % 8;

                    if (index == 0) {
                        i++;
                    }
                }

                retrunString = retrunString + BASE32CHAR.charAt(digit);
            }

            // 不滿8位的需要進行補“=”號,這是base32轉(zhuǎn)碼的規(guī)范
            while((retrunString.length % 8) !== 0){
                retrunString += "=";
            }

            return retrunString;
        }

二:使用實例

stringToBase32("馬到成功")
// 轉(zhuǎn)換為:"5GU2ZZMIWDTIREHFRKPQ===="

stringToBase64("馬到成功")
// 轉(zhuǎn)換為:"6ams5Yiw5oiQ5Yqf"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末大咱,一起剝皮案震驚了整個濱河市恬涧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碴巾,老刑警劉巖溯捆,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異厦瓢,居然都是意外死亡提揍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門煮仇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳跃,“玉大人,你說我怎么就攤上這事浙垫∨俾兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵绞呈,是天一觀的道長贸人。 經(jīng)常有香客問我,道長佃声,這世上最難降的妖魔是什么艺智? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮圾亏,結(jié)果婚禮上十拣,老公的妹妹穿的比我還像新娘。我一直安慰自己志鹃,他們只是感情好夭问,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹铃,像睡著了一般缰趋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陕见,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天秘血,我揣著相機與錄音,去河邊找鬼评甜。 笑死灰粮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的忍坷。 我是一名探鬼主播粘舟,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熔脂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柑肴?” 一聲冷哼從身側(cè)響起霞揉,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘉抒,沒想到半個月后零聚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡些侍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了政模。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岗宣。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淋样,靈堂內(nèi)的尸體忽然破棺而出耗式,到底是詐尸還是另有隱情,我是刑警寧澤趁猴,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布刊咳,位于F島的核電站,受9級特大地震影響儡司,放射性物質(zhì)發(fā)生泄漏娱挨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一捕犬、第九天 我趴在偏房一處隱蔽的房頂上張望跷坝。 院中可真熱鬧,春花似錦碉碉、人聲如沸柴钻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贴届。三九已至,卻和暖如春蜡吧,著一層夾襖步出監(jiān)牢的瞬間毫蚓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工斩跌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绍些,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓耀鸦,卻偏偏與公主長得像柬批,于是被迫代替她去往敵國和親啸澡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容