首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将base64字符串转换为ArrayBuffer

将base64字符串转换为ArrayBuffer
EN

Stack Overflow用户
提问于 2014-02-15 12:05:49
回答 12查看 249.2K关注 0票数 178

我需要将base64编码字符串转换为ArrayBuffer。base64字符串是用户输入的,它们将从电子邮件中复制和粘贴,所以当页面被加载时它们就不在了。我想在javascript中这样做,如果可能的话,不需要对服务器进行ajax调用。

我觉得这些链接很有趣,但它们帮助了我:

ArrayBuffer到base64编码字符串

这是相反的转换,从ArrayBuffer到base64,而不是相反的。

http://jsperf.com/json-vs-base64/2

这看起来不错,但我不知道如何使用这些代码。

是否有一种简单的(可能是本地的)方法来进行转换?谢谢

EN

Stack Overflow用户

发布于 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[] .

代码来自模块类,这就是为什么是静态的。

代码语言:javascript
代码运行次数:0
运行
复制
//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;
}
票数 1
EN
查看全部 12 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21797299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档