Base64按照字节截取的方法
又是一个rape.js遇到的问题,切割DataURL(base64)图片。
string.slice(start,end) 方法一般用来切割字符串,strat开头到end结尾。
但如果字符串被Base64加密,则无法按照常规方式进行切割。
Base64编码原理是将3个字节(3bytes)也就是3*8比特(3*8bit),
转换为4*6比特(4*6bit)并补码成4个常规8比特字节(4bytes)。
计算原始字符串长度,base64四分之三,减去空字符数量:
base64:输入的base64
length:原始字符串长度
var length=base64.length*0.75-(base64.slice(-2).match(/=/g)||[]).length;
这样Base64长度都是4字节的整数倍,我们从Base64中取出两端完整的字符串:
from:开始截取的位置
till:结束截取的位置
var pick=base64.slice(Math.floor((from||0)/3)*4,Math.ceil((till||length)/3)*4);
转换为utf-8字符串,根据偏移量截取字符串:
let part=atob(pick).slice(from%3,((till||length)%3||3)-3||length);
封装一个函:
function base64_slice(value,from,till){
let length=value.length*0.75-(value.slice(-2).match(/=/g)||[]).length;
if(!from||from<0){from=from?(length+from):0;};
if(!till||till<0){till=length+(till||0);};
if(till>length){till=length;};
return atob(value.slice(Math.floor(from/3)*4,Math.ceil(till/3)*4)).slice(from%3,(till%3||3)-3||length);
};