@javascript
首先對base64常見的認知,也是須知的必須有如下幾點*java
固然base64編碼也有必定的缺點正則表達式
ok,我認可以上都是百度出來了,接下來談談我本身的認識,哈哈數據庫
直接掏個例子吧,好比,原生js是自帶base64的編碼方法的編程
var b = Buffer.from('asdasds'); //buffer 是js裏面專門存放二進制的緩存區,暫時理解建立一個二進制變量 var s = b.toString('base64'); console.log(s) // YXNkYXNkcw==
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
64個字符中的一個轉換字符爲二進制數canvas
function toBinary (str){ let tempResult = []; let result = []; // 分割字符 str.split('').forEach(element => { //轉二進制 let binaryElement = element.charCodeAt().toString(2) //因爲js原生方法轉二進制若是前面是0可能會不滿8位,因此前面補0,轉爲8位的對應ascii碼二進制 binaryElement = binaryElement.length === 8 ? binaryElement : ('0' + binaryElement) //不足8位的二進制碼在前面補0 tempResult.push(binaryElement); }); let index = 0; // 不滿3個字符日後面補滿3個字符(3個字符(24個二進制位)是6和8的最小公倍數) while(tempResult.length % 3 != 0){ tempResult.push('00000000') } console.log(tempResult.length) return tempResult.join(''); } let binary = toBinary('asdasds');
那麼就是第一步和第二步實現了數組
二進制轉 base64字符串緩存
//將字符串存爲數組 let KEYCODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".split(''); function toBase64 (binary){ console.log(binary); let tempResult = []; let result = []; let index = 0; // 每6位切割二進制 while(index+6 < binary.length){ tempResult.push(binary.slice(index,index+6)) index = index + 6 ; } //不滿6位的前面補0 console.log(binary.slice(index,index+6)) tempResult.push(("000000" + binary.slice(index,index+6)).substr( -6 )); tempResult.forEach(element => { //將二進制轉爲數組下標 let index = parseInt(element,2); //獲取對應下標字符串 result.push(index === 0 ? '=' : KEYCODE[index]) }); //字符串拼接 return result.join('') } let a = toBase64(binary); console.log(a); // YXNkYXNkcw==
可是也存在一些問題和改進服務器
對於中文字符和特殊字符的支持編程語言
javascript中的中文都是默認utf-16編碼,可是網頁中編碼格式基本都是UTF-8,然而即使咱們用UTF-8格式保存了HTML文件,可是其中的中文字符依然是以UTF-16的形式保存的。因此咱們首先要將中文字符轉化爲utf-8,而後再轉二進制,最後便可用上面的方法進行編碼
代碼以下:
var utf16ToUtf8 = function (utf16Str) { var utf8Arr = []; var byteSize = 0; var tempList = []; for (var i = 0; i < utf16Str.length; i++) { //獲取字符Unicode碼值 var code = utf16Str.charCodeAt(i); //若是碼值是1個字節的範圍,則直接寫入 if (code >= 0x00 && code <= 0x7f) { byteSize += 1; utf8Arr.push(code); //若是碼值是2個字節以上的範圍,則按規則進行填充補碼轉換 } else if (code >= 0x80 && code <= 0x7ff) { byteSize += 2; utf8Arr.push((192 | (31 & (code >> 6)))); utf8Arr.push((128 | (63 & code))) } else if ((code >= 0x800 && code <= 0xd7ff) || (code >= 0xe000 && code <= 0xffff)) { byteSize += 3; utf8Arr.push((224 | (15 & (code >> 12)))); utf8Arr.push((128 | (63 & (code >> 6)))); utf8Arr.push((128 | (63 & code))) } else if(code >= 0x10000 && code <= 0x10ffff ){ byteSize += 4; utf8Arr.push((240 | (7 & (code >> 18)))); utf8Arr.push((128 | (63 & (code >> 12)))); utf8Arr.push((128 | (63 & (code >> 6)))); utf8Arr.push((128 | (63 & code))) } } var toBin = (n) => { if(n == 0) return '0'; var res = ''; while(n != 0) { res = n % 2 + res n = parseInt(n / 2) } return res; } utf8Arr.forEach(element => { tempList.push(toBin(element)) }); return tempList.join('') }
如何對圖片base64編碼進行實現
圖片的話,要用到canvas ,將圖片轉換爲二進制流,而後再掉用上述的編碼方法