首先對base64常見的認知,也是須知的必須有如下幾點*javascript
固然base64編碼也有必定的缺點java
ok,我認可以上都是百度出來了,接下來談談我本身的認識,哈哈正則表達式
直接掏個例子吧,好比,原生js是自帶base64的編碼方法的數據庫
var b = Buffer.from('asdasds'); //buffer 是js裏面專門存放二進制的緩存區,暫時理解建立一個二進制變量
var s = b.toString('base64');
console.log(s)
// YXNkYXNkcw==
複製代碼
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
64個字符中的一個轉換字符爲二進制數編程
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');
複製代碼
那麼就是第一步和第二步實現了canvas
二進制轉 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==
複製代碼
可是也存在一些問題和改進緩存
對於中文字符和特殊字符的支持bash
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 ,將圖片轉換爲二進制流,而後再掉用上述的編碼方法