base64_encode() 和 base64_decode() 8bit图片通过网络传输
一、為什么要使用base64編碼?
Base64是一種基于64個可打印字符來表示二進制數據的表示方法。
有些網絡傳送渠道并不支持所有的字節(jié),例如傳統(tǒng)的郵件只支持可見字符的傳送,像ASCII碼的控制字符就 不能通過郵件傳送。這樣用途就受到了很大的限制,比如圖片二進制流的每個字節(jié)不可能全部是可見字符,所以就傳送不了。最好的方法就是在不改變傳統(tǒng)協(xié)議的情 況下,做一種擴展方案來支持二進制文件的傳送。把不可打印的字符也能用可打印字符來表示,問題就解決了。Base64編碼應運而生,Base64就是一種 基于64個可打印字符來表示二進制數據的表示方法。
?
64個可視字符需要占6bit,一個字節(jié)有8個bit 位,剩下兩個bit就浪費掉了,這樣就不得不犧牲一部分空間了。這里需要弄明白的就是一個Base64字符是8個bit,但是有效部分只有右邊的6個 bit,左邊兩個永遠是0。
?
那么怎么用6個有效bit來表示傳統(tǒng)字符的8個bit呢?8和6的最小公倍數 是24,也就是說3個傳統(tǒng)字節(jié)可以由4個Base64字符來表示,保證有效位數是一樣的,這樣就多了1/3的字節(jié)數來彌補Base64只有6個有效bit 的不足。
?
二、PHP與Javascript中的base64編碼
PHP有原生方法base64_encode()與base64_decode(),用來對字符進行編碼與解碼。
JS沒有提供相應的方法,我們來自己實現:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | /**? ?*?base64編碼? ?*?@param?{Object}?str? ?*/?? function?base64encode(str){?? ????var?out,?i,?len;?? ????var?c1,?c2,?c3;?? ????len?=?str.length;?? ????i?=?0;?? ????out?=?"";?? ????while?(i?<?len)?{?? ????????c1?=?str.charCodeAt(i++)?&?0xff;?? ????????if?(i?==?len)?{?? ????????????out?+=?base64EncodeChars.charAt(c1?>>?2);?? ????????????out?+=?base64EncodeChars.charAt((c1?&?0x3)?<<?4);?? ????????????out?+=?"==";?? ????????????break;?? ????????}?? ????????c2?=?str.charCodeAt(i++);?? ????????if?(i?==?len)?{?? ????????????out?+=?base64EncodeChars.charAt(c1?>>?2);?? ????????????out?+=?base64EncodeChars.charAt(((c1?&?0x3)?<<?4)?|?((c2?&?0xF0)?>>?4));?? ????????????out?+=?base64EncodeChars.charAt((c2?&?0xF)?<<?2);?? ????????????out?+=?"=";?? ????????????break;?? ????????}?? ????????c3?=?str.charCodeAt(i++);?? ????????out?+=?base64EncodeChars.charAt(c1?>>?2);?? ????????out?+=?base64EncodeChars.charAt(((c1?&?0x3)?<<?4)?|?((c2?&?0xF0)?>>?4));?? ????????out?+=?base64EncodeChars.charAt(((c2?&?0xF)?<<?2)?|?((c3?&?0xC0)?>>?6));?? ????????out?+=?base64EncodeChars.charAt(c3?&?0x3F);?? ????}?? ????return?out;?? }?? /**? ?*?base64解碼? ?*?@param?{Object}?str? ?*/?? function?base64decode(str){?? ????var?c1,?c2,?c3,?c4;?? ????var?i,?len,?out;?? ????len?=?str.length;?? ????i?=?0;?? ????out?=?"";?? ????while?(i?<?len)?{?? ????????/*?c1?*/?? ????????do?{?? ????????????c1?=?base64DecodeChars[str.charCodeAt(i++)?&?0xff];?? ????????}?? ????????while?(i?<?len?&&?c1?==?-1);?? ????????if?(c1?==?-1)??? ????????????break;?? ????????/*?c2?*/?? ????????do?{?? ????????????c2?=?base64DecodeChars[str.charCodeAt(i++)?&?0xff];?? ????????}?? ????????while?(i?<?len?&&?c2?==?-1);?? ????????if?(c2?==?-1)??? ????????????break;?? ????????out?+=?String.fromCharCode((c1?<<?2)?|?((c2?&?0x30)?>>?4));?? ????????/*?c3?*/?? ????????do?{?? ????????????c3?=?str.charCodeAt(i++)?&?0xff;?? ????????????if?(c3?==?61)??? ????????????????return?out;?? ????????????c3?=?base64DecodeChars[c3];?? ????????}?? ????????while?(i?<?len?&&?c3?==?-1);?? ????????if?(c3?==?-1)??? ????????????break;?? ????????out?+=?String.fromCharCode(((c2?&?0XF)?<<?4)?|?((c3?&?0x3C)?>>?2));?? ????????/*?c4?*/?? ????????do?{?? ????????????c4?=?str.charCodeAt(i++)?&?0xff;?? ????????????if?(c4?==?61)??? ????????????????return?out;?? ????????????c4?=?base64DecodeChars[c4];?? ????????}?? ????????while?(i?<?len?&&?c4?==?-1);?? ????????if?(c4?==?-1)??? ????????????break;?? ????????out?+=?String.fromCharCode(((c3?&?0x03)?<<?6)?|?c4);?? ????}?? ????return?out;?? } |
?
三、實例
?
我們在PHP中創(chuàng)建一個八位二進制數組:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public?function?test() { ???$arr?=?array('220','30','55');?//三個八位字符 ???$normal?=?$this?->?bytesToString($arr); ???echo?$normal;??//�7 ???echo?'<br/>'; ???echo?base64_encode($normal);??//3B43 } private?function?bytesToString($bytes)?{ ???foreach($bytes?as?$ch)?{ ??????$str?.=?chr($ch); ???} ???return?$str; } |
?
?
同樣,如果我們想將一張圖片以json或類似的方式從服務器傳到前端,就必須對圖片進行base64的編碼。如果想顯示此圖片,就要將編碼得到的字符串放到img標簽的src屬性中,但是要注明是base64的字符串,即在字符串前加上data:image/png;base64,
| 1 | <img?src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAAA3NCSVQICAjb4U/gAAAABlBMVEX///+ZmZmOUEqyAAAAAnRSTlMA/1uRIrUAAAAJcEhZcwAACusAAArrAYKLDVoAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDkvMjAvMTIGkKG+AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAAB1JREFUCJljONjA8LiBoZyBwY6BQQZMAtlAkYMNAF1fBs/zPvcnAAAAAElFTkSuQmCC"?/> |
?
轉載于:https://www.cnblogs.com/ccymr/p/5472800.html
總結
以上是生活随笔為你收集整理的base64_encode() 和 base64_decode() 8bit图片通过网络传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决 Plugin with id 'c
- 下一篇: Unity3d 札记-Let's try