我需要将base64编码字符串转换为ArrayBuffer。base64字符串是用户输入的,它们将从电子邮件中复制和粘贴,所以当页面被加载时它们就不在了。我想在javascript中这样做,如果可能的话,不需要对服务器进行ajax调用。
我觉得这些链接很有趣,但它们帮助了我:
这是相反的转换,从ArrayBuffer到base64,而不是相反的。
http://jsperf.com/json-vs-base64/2
这看起来不错,但我不知道如何使用这些代码。
是否有一种简单的(可能是本地的)方法来进行转换?谢谢
发布于 2022-02-17 18:14:08
我使用这个问题的公认答案来在通过ASCII传输的base64Url数据领域中创建base64Url字符串<-> arrayBuffer转换[atob,btoa是base64with +/<->js二进制字符串],所以我决定发布代码。
我们中的许多人可能同时希望转换和客户机-服务器通信可以使用base64Url版本(虽然cookie可能包含+/以及-_字符,如果我完全理解,只有",\字符和128个ASCII中的一些邪恶字符是不允许的)。但是url不能包含/字符,因此更广泛地使用b64 url版本,这当然不是atob-btoa支持的.
看到其他评论,我想强调我这里的用例是通过url/cookie传输base64Url数据,并试图使用js (2017)来使用这些加密数据,因此需要ArrayBuffer表示和b64u <-> arrBuff转换.如果数组缓冲区表示的不是base64 (ascii的一部分),则此转换自atob以来就无法工作,btoa仅限于ascii(128)。请查看适当的转换器,如下所示:
buff -> b64u版本来自Mathias的一条推文,谢谢您的支持!他还写了一个base64编解码器:https://github.com/mathiasbynens/base64
来自java,在试图理解java byte[]实际上是js Int8Array (签名int)的代码时,它可能会有所帮助,但我们在这里使用的是未签名版本Uint8Array,因为js转换与它们一起工作。它们都是256位,所以我们现在叫它js byte[] .
代码来自模块类,这就是为什么是静态的。
//utility
/**
* Array buffer to base64Url string
* - arrBuff->byte[]->biStr->b64->b64u
* @param arrayBuffer
* @returns {string}
* @private
*/
static _arrayBufferToBase64Url(arrayBuffer) {
console.log('base64Url from array buffer:', arrayBuffer);
let base64Url = window.btoa(String.fromCodePoint(...new Uint8Array(arrayBuffer)));
base64Url = base64Url.replaceAll('+', '-');
base64Url = base64Url.replaceAll('/', '_');
console.log('base64Url:', base64Url);
return base64Url;
}
/**
* Base64Url string to array buffer
* - b64u->b64->biStr->byte[]->arrBuff
* @param base64Url
* @returns {ArrayBufferLike}
* @private
*/
static _base64UrlToArrayBuffer(base64Url) {
console.log('array buffer from base64Url:', base64Url);
let base64 = base64Url.replaceAll('-', '+');
base64 = base64.replaceAll('_', '/');
const binaryString = window.atob(base64);
const length = binaryString.length;
const bytes = new Uint8Array(length);
for (let i = 0; i < length; i++) {
bytes[i] = binaryString.charCodeAt(i);
}
console.log('array buffer:', bytes.buffer);
return bytes.buffer;
}
https://stackoverflow.com/questions/21797299
复制相似问题