@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 ,将图片转换为二进制流,而后再掉用上述的编码方法