base64編碼以及在圖片中的使用詳解

1静陈、概念:base64是指用64個(gè)基本的ASCII碼字符對數(shù)據(jù)進(jìn)行重新編碼
2螟碎、編碼字符表ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/,包括26個(gè)大寫英文字母倍谜、26個(gè)小寫英文字母、10個(gè)數(shù)字尔崔、加號“+”褥民、斜杠“/”共64個(gè)字符,而等號“=”則用來作為后綴用途
3载弄、編碼規(guī)則

(1)base64將需要編碼的數(shù)據(jù)拆分成字節(jié)數(shù)組,以3個(gè)字節(jié)為一組
(2)按順序排列24位(1byte=8bit)數(shù)據(jù)
(3)把24位數(shù)據(jù)分成4組宇攻,每組6位,并在每組的最高位前補(bǔ)兩個(gè)0湊足一個(gè)字節(jié)嘉涌。這樣就把一個(gè)3字節(jié)為一組的數(shù)據(jù)重新編碼成了4個(gè)字節(jié)
(4)當(dāng)所要編碼的數(shù)據(jù)的字節(jié)數(shù)不是3的整倍數(shù)時(shí)仑最,即在分組時(shí)最后一組不夠3個(gè)字節(jié),這時(shí)就在最后一組填充1到2個(gè)全0字節(jié)警医,并在最后編碼完成后在結(jié)尾添加1到2個(gè)“=”坯钦,因此常常看到編碼后輸出的文本末尾可能會出現(xiàn)1或2個(gè)“=”

4深啤、解碼規(guī)則

解碼過程就是把4個(gè)字節(jié)再還原成3個(gè)字節(jié)路星,再根據(jù)不同的數(shù)據(jù)形式把字節(jié)數(shù)據(jù)重新整理成數(shù)據(jù)

5洋丐、舉個(gè)栗子

對ABC進(jìn)行base64編碼挥等,步驟如下:
(1)首先取ABC對應(yīng)的ASCII碼值:A(65)、B(66)迁客、C(67)
(2)再取二進(jìn)制值:A(01000001)B(01000010)C(01000011)
(3)把3個(gè)字節(jié)的二進(jìn)制碼鏈接起來作為一組:010000010100001001000011
(4)再以6位為一組辞槐,分成4組數(shù)據(jù),并在最高位前補(bǔ)兩個(gè)0湊足一個(gè)字節(jié):(00010000)(00010100)(00001001)(00000011)卜范,其中加粗部分為真實(shí)數(shù)據(jù)
(5)再把4個(gè)字節(jié)數(shù)據(jù)轉(zhuǎn)換成10進(jìn)制數(shù):(16)(20)(9)(3)
(6)最后根據(jù)base64字符表,查找對應(yīng)的ASCII碼字符:(Q)(U)(J)(D)海雪,這里的值實(shí)際就是數(shù)據(jù)在字符表中的索引,且索引從0開始

6奥裸、base64支持的圖片格式:PNG、GIF樟氢、JPG、BMP嗡害、ICO
7畦攘、base64對于圖片編碼的使用:

(1)在CSS中的使用:background-image: url("data:image/jpg;base64,/9j/4QMZR...")
(2)在HTML中的使用:<img src="data:image/jpg;base64,/9j/4QMZR..." />

8、base64圖片編碼與原始圖片大小關(guān)系

Base64編碼要求把3個(gè)8位字節(jié)(38=24)轉(zhuǎn)化為4個(gè)6位的字節(jié)(46=24)叹螟,之后在6位的前面補(bǔ)兩個(gè)0台盯,形成8位一個(gè)字節(jié)的形式。 如果剩下的字符不足3個(gè)字節(jié)良价,則用0填充蒿叠,輸出字符使用’=’,因此編碼后輸出的文本末尾可能會出現(xiàn)1或2個(gè)’=’痊银,由base64編碼原理我們知道,base64的圖片字符流中的每8個(gè)字符就有兩個(gè)是用0補(bǔ)充溯革,而且字符流的末尾還可能存在‘=’號谷醉,我們可以通過這個(gè)原理計(jì)算圖片的文件流大小。豺裆,以下面base64編碼為例詳解編碼后圖片與原始圖片的大小關(guān)系,如:

data:image/png;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAB9SR//fUkf/31JH/99SR//fUkf/31JH/99SR//fUkf/31JH/99SR//fUkf/6mHbP+LXDf/fUkf/31JH/99SR//fUkf/31JH/99SR//fUkf/31JH/99SR//i104/5lwT/+RZkP/fksh/6eFaP/8/Pv/mG9N/31JH/99SR//fUkf/31JH/99SR//fUkf/31JH/+tjHL/6uHb//7+/v////////////Xx7v/8+/r//////6N/Yv99SR//fUkf/31JH/99SR//fUkf/35LIf/PvK3///////////////////////////////////////////+vj3b/fUkf/31JH/99SR//fUkf/31JH/++pI/////////////08Oz/vqSQ/8y3p///////////////////////u6CK/31JH/99SR//fUkf/31JH/+IWDL/+vn3///////s5d//iVo1/6B7XP/6+ff/8Orl/9TDtv+5nYb/nXZX/4NRKf9+SyL/fUkf/31JH/99SR//sJF3////////////onxe/35LIv+ge1z/ils1/31JH/99SR//fUkf/6qIbf/dz8T/1MK0/31JH/99SR//fUkf/8WunP///////Pv7/39MIv99SR//fUkf/31JH/99SR//fUkf/31JH//ay7///////+ri2/99SR//fUkf/31JH//Frpv///////38+/9/TCP/fUkf/31JH/99SR//fUkf/31JH/99SR//2szA///////q4dv/fUkf/31JH/99SR//r491////////////pIBi/31JH/99SR//fUkf/31JH/99SR//hVUt//j29P//////1MK1/31JH/99SR//fUkf/4dXMP/59/b//////+7o4/+MXjn/fUkf/31JH/99SR//gE0k/9XFuP///////////6aDZ/99SR//fUkf/31JH/99SR//up+I////////////9vPw/8OrmP+si3D/uZ2G/+ri2////////////97Rx/99SiD/fUkf/31JH/99SR//fUkf/31KIP/KtqX//v7+/////////////////////////////////+Xb0/+HWDH/fUkf/31JH/99SR//fUkf/31JH/99SR//fUkf/6eFaP/l2tL//v7+////////////8evn/7yhi/+BTyb/fUkf/31JH/99SR//fUkf/31JH/99SR//fUkf/31JH/99SR//fUkf/4dXMP+Uakf/jV86/31JH/99SR//fUkf/31JH/99SR//fUkf/31JH/9/SyH/f0sh/39LIf9/SyH/f0sh/39LIf9/SyH/f0sh/39LIf9/SyH/f0sh/39LIf9/SyH/f0sh/39LIf9/SyH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==

(1)把上述base64編碼存放在變量str中躺酒,計(jì)算文件流大小需要去掉頭部data:image/png;base64,(注意有逗號)

str = str.substring(22)     // 1536

或是:

str = str.split(",")[1]     // 1536

(2)找到等號“=”羹应,把等號去掉

var equalIndex = str.indexOf('=');
if(str.indexOf('=') > 0){
        str = str.substring(0, equalIndex);
}

(3)編碼后字符流大小次屠,單位為字節(jié)(一個(gè)英文字符為一個(gè)字節(jié))

var strLength = str.length();     // 1534

(4)編碼后文件流大小,單位為字節(jié)

var fileLength = parseInt(strLength*3/4);     // 1150劫灶,可以通過 strLength/fileLength  = 4/3 進(jìn)行推導(dǎo),并且注意1150只是字節(jié)數(shù)供汛,并不是所謂的文件大小表示方式中的KB

或是:

var fileLength = parseInt(strLength-(strLength/8)*2);      // 1150涌穆,編碼后的數(shù)據(jù)中每8位中就有2位是添加的0補(bǔ)位,因此所有的0補(bǔ)位總數(shù)為:(strLength/8)*2
9趁舀、總結(jié)

從以上編碼規(guī)則可以得知,通過base64編碼矮烹,原來的3個(gè)字節(jié)編碼后將成為4個(gè)字節(jié)罩锐,即字節(jié)增加了33.3%,數(shù)據(jù)量相應(yīng)變大。所以10M的數(shù)據(jù)通過base64編碼后大小大概為10M*133.3%=13.33M搬味。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萍聊,隨后出現(xiàn)的幾起案子悦析,更是在濱河造成了極大的恐慌,老刑警劉巖亭螟,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件预烙,死亡現(xiàn)場離奇詭異,居然都是意外死亡扁掸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門锈麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忘伞,“玉大人,你說我怎么就攤上這事虑省∩耍” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵伪节,是天一觀的道長绩鸣。 經(jīng)常有香客問我,道長化借,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任蓖康,我火速辦了婚禮蒜焊,結(jié)果婚禮上科贬,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好乘综,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布瘾带。 她就那樣靜靜地躺著,像睡著了一般熟菲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抄罕,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天呆贿,我揣著相機(jī)與錄音,去河邊找鬼做入。 笑死,一個(gè)胖子當(dāng)著我的面吹牛壶运,可吹牛的內(nèi)容都是我干的浪秘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼棵癣,長吁一口氣:“原來是場噩夢啊……” “哼夺衍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起的畴,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎护桦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缓呛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年哟绊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痰憎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洽沟,死狀恐怖裆操,靈堂內(nèi)的尸體忽然破棺而出炉媒,到底是詐尸還是另有隱情,我是刑警寧澤吊骤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站密强,受9級特大地震影響蜗元,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奕扣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一惯豆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧地熄,春花似錦、人聲如沸芯杀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裂明。三九已至椿浓,卻和暖如春闽晦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背左腔。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工液样, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巧还,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓澎怒,卻偏偏與公主長得像阶牍,于是被迫代替她去往敵國和親喷面。 傳聞我的和親對象是個(gè)殘疾皇子惧辈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354