Open hushicai opened 5 years ago
在浏览器端,我们可以利用btoa来转换,其定义如下:
let encodedData = window.btoa(stringToEncode);
按照mdn上的文档,参数stringToEncode:
stringToEncode
一个字符串, 其字符分别表示要编码为 ASCII 的二进制数据的单个字节。
btoa会自动stringToEncode中的每个字符转化为对应的二进制编码(unicode代码点):
btoa
window.btoa('Hello, World') // SGVsbG8sIFdvcmxk
虽然字面上是文本,但其实也是“二进制”转base64。
如果输入内容是一串8位比特字符串:
"1001000,1100101,1101100,1101100,1101111,101100,100000,1010111,1101111,1110010,1101100,1100100"
为了方便处理,这里用逗号分隔。
// 比特串转为文本 const binaryStringToText = binaryString => { return binaryString.split(',').map(b => { return String.fromCharCode(parseInt(b, 2)); }).join(''); }; const binaryStringToBase64 = binaryString => { let text = binaryStringToText(binaryString); return window.btoa(text); }; binaryStringToBase64("1001000,1100101,1101100,1101100,1101111,101100,100000,1010111,1101111,1110010,1101100,1100100"); // SGVsbG8sIFdvcmxk
如果输入内容是一串ASCII编码的字符串:
72,101,108,108,111,44,32,87,111,114,108,100
我们换一种方式来处理,使用Uint8Array:
const binaryStringToText = binaryString => { let data = binaryString.split(',').map(v => +v); return String.fromCharCode(...new Uint8Array(data)); }; const binaryStringToBase64 = binaryString => { let text = binaryStringToText(binaryString); return window.btoa(text); }; binaryStringToBase64("72,101,108,108,111,44,32,87,111,114,108,100"); // SGVsbG8sIFdvcmxk
base64转为二进制,首先需要通过atob来解码,其定义如下:
var decodedData = window.atob(encodedData);
如果传入字符串不是有效的 base64 字符串,比如其长度不是 4 的倍数,则抛出DOMException。
DOMException
const base64ToBinary = base64 => { let text = window.atob(base64); let textLength = text.length; let array = new Uint8Array(new ArrayBuffer(textLength)); for(i = 0; i < textLength; i++) { array[i] = text.charCodeAt(i); } return array; } let uInt8Array = base64ToBinary('SGVsbG8sIFdvcmxk'); // Uint8Array(12) [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100] binaryStringToText(uInt8Array.toString()); // Hello, World
如果是纯JS实现,请参考js-base64。
base64编码算法,请参考Base64。
二进制转base64
在浏览器端,我们可以利用btoa来转换,其定义如下:
按照mdn上的文档,参数
stringToEncode
:btoa
会自动stringToEncode
中的每个字符转化为对应的二进制编码(unicode代码点):虽然字面上是文本,但其实也是“二进制”转base64。
如果输入内容是一串8位比特字符串:
为了方便处理,这里用逗号分隔。
如果输入内容是一串ASCII编码的字符串:
我们换一种方式来处理,使用Uint8Array:
base64转二进制
base64转为二进制,首先需要通过atob来解码,其定义如下:
如果传入字符串不是有效的 base64 字符串,比如其长度不是 4 的倍数,则抛出
DOMException
。