前端开发必备:深入理解btoa和atob函数
创作时间:
作者:
@小白创作中心
前端开发必备:深入理解btoa和atob函数
引用
CSDN
等
8
来源
1.
https://blog.csdn.net/qq_36380426/article/details/138174248
2.
https://blog.csdn.net/weixin_44283589/article/details/132165045
3.
https://cloud.baidu.com/article/3320935
4.
https://blog.csdn.net/carcarrot/article/details/100705946
5.
https://www.zhangxinxu.com/wordpress/2018/08/js-base64-atob-btoa-encode-decode/comment-page-1/
6.
https://www.cnblogs.com/djane/articles/10857826.html
7.
https://my.oschina.net/emacs_8600208/blog/16740193
8.
https://www.cnblogs.com/ziChin/p/17897499.html
在前端开发中,btoa
和 atob
是两个非常实用的全局函数,主要用于处理 Base64 编码和解码。它们在数据传输、存储以及安全场景中发挥重要作用。本文将深入解析这两个函数的使用方法、应用场景以及注意事项。
基本功能与使用
btoa
和 atob
的名称和功能可以这样理解:
函数名 | 全称 | 输入 → 输出 | 作用 |
---|---|---|---|
btoa | Binary to ASCII | 二进制字符串 → Base64 字符串 | 编码 |
atob | ASCII to Binary | Base64 字符串 → 二进制字符串 | 解码 |
基本用法示例
const text = "Hello, world!";
const base64Text = btoa(text); // "SGVsbG8sIHdvcmxkIQ=="
const decodedText = atob(base64Text); // "Hello, world!"
实际应用场景
1. 数据传输
在不支持二进制数据的系统之间传输数据时,可以使用 Base64 编码。例如,在 WebSocket 中传输音频数据:
// 发送音频数据前编码
const audioData = new Uint8Array([...]);
const base64Audio = btoa(String.fromCharCode(...audioData));
socket.send(base64Audio);
// 接收后解码
socket.onmessage = (event) => {
const binaryData = atob(event.data);
const audioBlob = new Blob([binaryData], {type: 'audio/mpeg'});
// 播放音频
};
2. 图片数据处理
可以直接在 HTML 中嵌入 Base64 编码的图片:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
3. 跨域通信
在需要绕过浏览器的同源策略时,可以使用 Base64 编码来传输数据。
Unicode 字符处理
btoa
不能直接处理 Unicode 字符,比如中文。需要先进行 URI 编码:
// 错误用法(直接编码中文会报错)
btoa("中文"); // ❌ 报错:InvalidCharacterError
// 正确做法:先转码
function utf8ToBase64(str) {
return btoa(unescape(encodeURIComponent(str)));
}
function base64ToUtf8(base64) {
return decodeURIComponent(escape(atob(base64)));
}
utf8ToBase64("你好"); // "JUU0JUJEJUEwJUU1JUE1JUJE"
base64ToUtf8("JUU0JUJEJUEwJUU1JUE1JUJE"); // "你好"
性能优化
对于大文件,可以采用分块处理的方式避免内存溢出:
async function encodeLargeFile(file) {
const chunkSize = 1024 * 1024; // 1MB
let offset = 0;
while (offset < file.size) {
const chunk = file.slice(offset, offset + chunkSize);
const arrayBuffer = await chunk.arrayBuffer();
const base64Chunk = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
// 发送或存储 base64Chunk
offset += chunkSize;
}
}
兼容性解决方案
btoa
和 atob
在 IE10+ 及所有现代浏览器中都支持。对于 IE8/IE9,可以使用 polyfill:
<!--[if IE]>
<script src="./base64-polyfill.js"></script>
<![endif]-->
或者提供替代实现:
if (!window.atob) {
window.atob = function(encodedString) {
// 替代实现代码
};
}
总结对比表
特性 | btoa | atob |
---|---|---|
方向 | 编码 → Base64 | 解码 → 原始数据 |
输入类型 | 二进制字符串 | Base64 字符串 |
Unicode 支持 | 需手动转码(UTF-8 → 字节) | 需手动转码(字节 → UTF-8) |
适用场景 | 文本/二进制数据的文本化传输 | 还原编码后的数据 |
浏览器兼容性 | 所有现代浏览器 | 所有现代浏览器 |
通过本文的介绍,相信你已经掌握了 btoa
和 atob
的使用方法和注意事项。在实际开发中,合理运用这两个函数,可以让你的数据处理更加高效和灵活。
热门推荐
实物资产投资指南:如何选择与管理高价值资产
用于时间序列中的变点检测算法
甘麦大枣汤:更年期女性之友!
汽车安全新篇:必备配置,让每次旅程安心无忧
水仙花怎么描写?新手小白也能轻松驾驭的写作技巧!
如何制作高质量的人事行政部工作总结PPT?
推动含汞医疗设备淘汰,渝中区启动医疗机构无汞替代试点
煮水泡茶,茶具也有讲究?什么材质的最好?
寿喜锅为什么叫寿喜锅
养老金福利来了!两大公式计算,你的养老金能领多少?
雨天怎么描述:细致刻画雨景的技巧与表达方法!
有蛋白尿,没有高血压,为什么医生要开降压药?
东吴“第一谋士”鲁肃,表面老实本分,实则是三国中最有城府之人
铜价为何会出现溢价现象?这种溢价如何反映市场供需关系?
如何确保方向盘回正并保持车辆稳定?这种驾驶技巧对行车安全有何影响?
电阻应变片对其基底材料有哪些要求
盘点国内几大草莓基地(附全国草莓分布图)
三江交汇之地|铜鉴湖公园生态修复
“不死之花”太阳花养殖全攻略:六大要点让你四季花开不断
even是什么意思?英语单词的多重含义与用法
如何自行检查臀下皮神经是否受压
八字无贵人是不是很惨
莲须的功效与作用及食用方法详解
如何选择合适的装修风格和材料?在家庭装修过程中应该如何平衡美观与实用性?
撞伤后冷敷热敷的时机与操作指南
推拿按摩:自然缓解耳鸣的温柔疗法
雲朗教育:内向的人也能做好短视频运营
中国重要的地理分界线——胡焕庸线
艾草可以杀菌消毒吗?医生这样说
象形字是什么意思?了解象形字的定义与特点