用代码实现把字符串转换成 base64 编码
1. btoa
btoa(unescape(encodeURIComponent(this.inText)));
2. 手动实现
function stringToBase64(str) { // 将字符串转换为二进制数组 let binaryArr = []; for (let i = 0; i < str.length; i++) { binaryArr.push(str.charCodeAt(i)); } // 将二进制数组转换为base64字符串 let base64Str = ''; const base64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; for (let i = 0; i < binaryArr.length; i += 3) { let b1 = binaryArr[i]; let b2 = i + 1 < binaryArr.length ? binaryArr[i + 1] : 0; let b3 = i + 2 < binaryArr.length ? binaryArr[i + 2] : 0; let c1 = b1 >> 2; let c2 = ((b1 & 0x03) << 4) | (b2 >> 4); let c3 = ((b2 & 0x0f) << 2) | (b3 >> 6); let c4 = b3 & 0x3f; base64Str += base64Table[c1] + base64Table[c2] + base64Table[c3] + base64Table[c4]; } // 补全base64字符串的结尾 let paddingCount = (3 - binaryArr.length % 3) % 3; base64Str = base64Str.slice(0, base64Str.length - paddingCount); for (let i = 0; i < paddingCount; i++) { base64Str += '='; } return base64Str; } console.log(stringToBase64('hello world') === btoa('hello world'))
Base64 编码是基于 64 个字符 A-Z、a-z、0-9、+、/ 的编码方式,因为2的6次方正好为 64,所以就用 6bit 就可以表示出64个字符,000000 对应 A,000001 对应 B
以每 3 个 字符(1Byte = 8bit)为一组,然后针对每组,首先获取每个字符的 ASCII 编码(字符 'a'=97=01100001
),然后将 ASCII 编码转换成 8 bit 的二进制,得到一组 3 * 8 = 24 bit
的字节。然后再将这 24 bit 划分为 4 个 6 bit 的字节,并在每个 6 bit 的字节前面都填两个高位 0,得到 4 个 8 bit 的字节,然后将这 4 个 8 bit 的字节转换成十进制,对照 BASE64 编码表 ,得到对应编码后的字符,空位不足补=
解码
将4个字节转换成3个字节,先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了
注意
base64 不支持中文,所以需要先编码 encodeURI 即可
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论