哇哦,又学习到了新知识啦,之前用到Base64最多的地方就是把项目中的小图片转为Base64,因为这样可以减少一个HTTP请求哦。
然而,今天在搞一个需求,就是想通过Base64编码字符串是否可以得知实际文件的大小,一顿搜索引擎后,发现了新大陆,完全是可以的,甚是喜悦啊,因为这是新知识啊,学习的感觉真好,所以测试完成后,赶紧记录下来,分享给大家。
关于Base64的理论的知识,我就不bb了,我会把我搜索到的信息资料,放到下方的参考资料中哦,所以直接开始实战了。
比如,已知的Base64编码的字符串如下;
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAGdYAABnWARjRyu0AAAAMSURBVBhXY/j//z8ABf4C/qc1gYQAAAAASUVORK5CYII=
1、去除头部的Data URI scheme,比如上面列子中的,data:image/png;base64,
2、计算公式,(向上取整(Base64长度 / 4) * 3 ) - 填充长度
Base64长度:是指不包含填充部分的长度,如上面的列子为159
填充长度:查看Base64编码字符串末尾有几个等号(不会超过2个,所以值的范围为0,1,2),即为长度的数量,如上面列子为1
所以上面列子中的,文件大小为119字节(Byte),成功跟电脑上显示字节一样,我们成功啦。
下面也放个,我用JavaScript写的已知Base64编码字符串计算文件大小的代码;
/** * 已知Base64编码字符串计算文件大小的代码 * @param str Base64编码字符串 * @returns { number } 文件大小(字节) */ function calcBase64ToFileSize(str) { let padding = 0; str = str.substring(str.indexOf(",") + 1); if (str.endsWith("==")) { padding = 2; } else if (str.endsWith("=")) { padding = 1; } return Math.ceil(str.length / 4) * 3 - padding; }