标签:名称 || 数组下标 表示 避免 str 建立 tle 哈哈
@( 对于前端工程师来说base64图片编码到底是个什么玩意?)
****
----
首先对base64常见的认知,也是须知的必须有以下几点*
当然base64编码也有一定的缺点
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');
那么就是第一步和第二步实现了
二进制转 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 ,将图片转换为二进制流,然后再掉用上述的编码方法
前端对base64编码的理解,原生js实现字符base64编码
标签:名称 || 数组下标 表示 避免 str 建立 tle 哈哈
原文地址:https://www.cnblogs.com/zclub/p/11412255.html