亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

關于base64編碼的原理及實現方法分享

2024-07-21 02:02:29
字體:
來源:轉載
供稿:網友
一、Base64編碼原理

步驟1:將所有字符轉化為ASCII碼;
步驟2:將ASCII碼轉化為8位二進制;
步驟3:將二進制3個歸成一組(不足3個在后邊補0)共24位,再拆分成4組,每組6位;
步驟4:統一在6位二進制前補兩個0湊足8位;
步驟5:將補0后的二進制轉為十進制;
步驟6:從Base64編碼表獲取十進制對應的Base64編碼;



說明:不足3個補0的最終Base64編碼為=,而不是A!

二、Base64編碼示例

示例一:zyq對應Base64編碼為enlx


示例二:mzwu對應Base64編碼為bXp3dQ==
 


雖然除ie外,大部分現代瀏覽器都已經支持原生的基于base64的encode和decode,例如btoa和atob。(將canvas畫布保存成img并強制改變mimetype進行下載,會在下一篇記錄)

但是處于好奇心,還是驅使我去了解下base64編碼的原理。以便也在不支持原生base64編碼的ie下可以得以實現。

【Base64】
-base64的編碼都是按字符串長度,以每3個8bit的字符為一組,
-然后針對每組,首先獲取每個字符的ASCII編碼,
-然后將ASCII編碼轉換成8bit的二進制,得到一組3*8=24bit的字節
-然后再將這24bit劃分為4個6bit的字節,并在每個6bit的字節前面都填兩個高位0,得到4個8bit的字節
-然后將這4個8bit的字節轉換成10進制,對照Base64編碼表 (下表),得到對應編碼后的字符。

(注:1. 要求被編碼字符是8bit的,所以須在ASCII編碼范圍內,/u0000-/u00ff,中文就不行。
   2. 如果被編碼字符長度不是3的倍數的時候,則都用0代替,對應的輸出字符為=)

Base64 編碼表
ValueChar ValueChar ValueChar ValueChar
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/

比如舉下面2個例子:
a) 字符長度為能被3整除時:比如“Tom” :

復制代碼 代碼如下:

T           o           m
ASCII:      84          111         109
bit字節:   01010100    01101111    01101101
bit字節:     010101      000110      111101      101101
十進制:     21          6           61          45
對應編碼:   V           G           9           t

所以,btoa('Tom') = VG9t
b) 字符串長度不能被3整除時,比如“Lucy”:
復制代碼 代碼如下:

L           u           c           y
ASCII:      76          117         99          121
bit字節:   01001100    01110101    01100011    01111001      00000000    00000000
bit字節:     010011      000111      010101      100011      011110  010000  000000  000000
十進制:     19          7           21          35             30      16      (異常) (異常)     
對應編碼:   T           H           V           j               e       Q       =       =

由于Lucy只有4個字母,所以按3個一組的話,第二組還有兩個空位,所以需要用0來補齊。這里就需要注意,因為是需要補齊而出現的0,所以轉化成十進制的時候就不能按常規用base64編碼表來對應,所以不是a, 可以理解成為一種特殊的“異?!?,編碼應該對應“=”。
有了上面的理論,那我們實現一個base64編碼就容易了。
復制代碼 代碼如下:

/**
 * base64 encoding & decoding
 * for fixing browsers which don't support Base64 | btoa |atob
 */
(function (win, undefined) {
     var Base64 = function () {
        var base64hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
        // btoa method
        function _btoa (s) {
            if (/([^/u0000-/u00ff])/.test(s)) {
                throw new Error('INVALID_CHARACTER_ERR');
            }   
            var i = 0,
                prev,
                ascii,
                mod,
                result = [];
            while (i < s.length) {
                ascii = s.charCodeAt(i);
                mod = i % 3;
                switch(mod) {
                    // 第一個6位只需要讓8位二進制右移兩位
                    case 0:
                        result.push(base64hash.charAt(ascii >> 2));
                        break;
                    //第二個6位 = 第一個8位的后兩位 + 第二個8位的前4位
                    case 1:
                        result.push(base64hash.charAt((prev & 3) << 4 | (ascii >> 4)));
                        break;
                    //第三個6位 = 第二個8位的后4位 + 第三個8位的前2位
                    //第4個6位 = 第三個8位的后6位
                    case 2:
                        result.push(base64hash.charAt((prev & 0x0f) << 2 | (ascii >> 6)));
                        result.push(base64hash.charAt(ascii & 0x3f));
                        break;
                }
                prev = ascii;
                i ++;
            }
            // 循環結束后看mod, 為0 證明需補3個6位,第一個為最后一個8位的最后兩位后面補4個0。另外兩個6位對應的是異常的“=”;
            // mod為1,證明還需補兩個6位,一個是最后一個8位的后4位補兩個0,另一個對應異常的“=”
            if(mod == 0) {
                result.push(base64hash.charAt((prev & 3) << 4));
                result.push('==');
            } else if (mod == 1) {
                result.push(base64hash.charAt((prev & 0x0f) << 2));
                result.push('=');
            }
            return result.join('');
        }
        // atob method
        // 逆轉encode的思路即可
        function _atob (s) {
            s = s.replace(//s|=/g, '');
            var cur,
                prev,
                mod,
                i = 0,
                result = [];
            while (i < s.length) {
                cur = base64hash.indexOf(s.charAt(i));
                mod = i % 4;
                switch (mod) {
                    case 0:
                        //TODO
                        break;
                    case 1:
                        result.push(String.fromCharCode(prev << 2 | cur >> 4));
                        break;
                    case 2:
                        result.push(String.fromCharCode((prev & 0x0f) << 4 | cur >> 2));
                        break;
                    case 3:
                        result.push(String.fromCharCode((prev & 3) << 6 | cur));
                        break;
                }
                prev = cur;
                i ++;
            }
            return result.join('');
        }
        return {
            btoa: _btoa,
            atob: _atob,
            encode: _btoa,
            decode: _atob
        };
    }();
    if (!win.Base64) { win.Base64 = Base64 }
    if (!win.btoa) { win.btoa = Base64.btoa }
    if (!win.atob) { win.atob = Base64.atob }
 })(window)

Base64 example

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产香蕉97碰碰久久人人| 国产亚洲综合久久| 欧美日韩一区二区三区在线免费观看| 日产精品久久久一区二区福利| 亚洲第一视频在线观看| 国产精品自拍偷拍| 精品日韩中文字幕| 国产精品久久久亚洲| 国产91精品最新在线播放| 国产精品夜色7777狼人| 亚洲性线免费观看视频成熟| 欧洲成人免费aa| 亚洲最大福利视频网站| 亚洲午夜久久久久久久| 日韩国产欧美精品一区二区三区| 亚洲国产一区二区三区在线观看| 日韩有码在线观看| 国产精品一区二区久久久久| 欧美大秀在线观看| 色综合久久久久久中文网| 欧美高清一级大片| 欧美高清视频在线观看| 亚洲欧洲日本专区| 精品国产欧美一区二区五十路| 日本国产欧美一区二区三区| 亚洲欧美国产va在线影院| 日韩精品欧美激情| 国产成人一区二区在线| 中文字幕日韩有码| 欧美黑人又粗大| 亚洲国产精品久久久| 日韩最新在线视频| 久久亚洲电影天堂| 日韩精品高清在线观看| 日韩免费av一区二区| 亚洲福利视频专区| 午夜美女久久久久爽久久| 狠狠躁18三区二区一区| 国产国产精品人在线视| 国产成人一区二区三区| 精品国产91乱高清在线观看| 51色欧美片视频在线观看| 国产在线98福利播放视频| 国产精品一香蕉国产线看观看| 国产精品精品视频一区二区三区| 国产午夜精品麻豆| 播播国产欧美激情| 日韩高清av一区二区三区| 日本成人激情视频| 日韩中文字幕网址| 欧美精品少妇videofree| 中文字幕在线看视频国产欧美在线看完整| 欧美黑人性猛交| 91久久综合亚洲鲁鲁五月天| 97香蕉久久夜色精品国产| 色狠狠久久aa北条麻妃| 欧美巨乳美女视频| 欧美激情精品久久久| 久久精品久久久久久| 久久99精品久久久久久琪琪| 欧美激情网站在线观看| 国产日本欧美一区二区三区| 91精品国产成人| 精品视频偷偷看在线观看| 欧美激情视频在线| 国产69精品久久久久9| 亚洲精品国产精品国自产在线| 亚洲a在线观看| 不用播放器成人网| 日韩av在线网址| 热久久这里只有| 精品久久久久久国产| 国产精品三级网站| 国产97色在线|日韩| 日韩免费av片在线观看| 久久久久久久爱| 91人成网站www| 色综合91久久精品中文字幕| 国产精品中文字幕在线观看| 国产丝袜精品第一页| 国模精品视频一区二区| 日韩中文字幕在线精品| 亚洲精品国产精品自产a区红杏吧| 精品精品国产国产自在线| 国产精品青草久久久久福利99| 久久久久国产精品免费| 欧美体内谢she精2性欧美| 成人激情电影一区二区| 日韩日本欧美亚洲| 亚洲男人天堂古典| 国产精品igao视频| 欧美电影免费观看高清完整| 亚洲综合精品一区二区| 在线电影欧美日韩一区二区私密| 日韩av在线免费观看一区| 久久久国产在线视频| 一本色道久久88亚洲综合88| 欧美在线中文字幕| 91国内免费在线视频| 国产精欧美一区二区三区| 91精品在线播放| 91免费欧美精品| 精品国产成人av| 最新69国产成人精品视频免费| 欧美理论电影在线播放| 亚洲最大福利视频网| 国产精品免费小视频| 亚洲人午夜精品免费| 少妇激情综合网| 九九精品视频在线观看| 国产欧美日韩中文字幕| 亚洲精品免费网站| 日韩欧美中文在线| 亚洲美女精品久久| 91在线视频精品| 日韩电影免费观看在线观看| 在线观看视频99| 茄子视频成人在线| 日韩av免费网站| 久久国产色av| 一区二区在线视频播放| 国产成人亚洲综合青青| 国产午夜精品视频免费不卡69堂| 日韩精品视频在线观看网址| 91免费观看网站| 97在线视频精品| 日韩av影视在线| 日本成人精品在线| 欧美日韩裸体免费视频| 欧美一区二粉嫩精品国产一线天| 91情侣偷在线精品国产| 国产精品久久久久久久午夜| 久久视频在线视频| 欧美另类在线播放| 色综合久久精品亚洲国产| 亚洲精品成人久久电影| 亚洲天堂网站在线观看视频| 亚洲国产女人aaa毛片在线| 丝袜亚洲另类欧美重口| 在线观看欧美视频| 91人人爽人人爽人人精88v| 欧美亚洲激情在线| 日韩资源在线观看| 91网站免费看| 亚洲免费视频观看| 久久香蕉频线观| 欧美视频在线免费| 久久九九精品99国产精品| 亚洲精品日韩久久久| 96pao国产成视频永久免费| 欧美极品xxxx| 国产精品日韩欧美综合| 亚洲福利视频专区| 久久精品电影一区二区| 亚洲日本aⅴ片在线观看香蕉| 久久精品久久久久久国产 免费| 国产精品伦子伦免费视频| 国产美女久久精品香蕉69| 欧美性生交大片免网| 亚洲成人xxx| 国产91精品视频在线观看| 97香蕉久久超级碰碰高清版| 亚洲精品www久久久久久广东| 中文字幕不卡av|