我的编程空间,编程开发者的网络收藏夹
学习永远不晚

js怎么实现小程序wx.arrayBufferToBase64方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

js怎么实现小程序wx.arrayBufferToBase64方法

这篇文章主要为大家展示了“js怎么实现小程序wx.arrayBufferToBase64方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js怎么实现小程序wx.arrayBufferToBase64方法”这篇文章吧。

前言

在小程序开发中,需要将接口请求获得的arrayBuffer数据,转换为base64格式数据,进行图片的显示。

微信小程序提供了wx.arrayBufferToBase64方法,但很不幸,这个方法在基础库版本 2.4.0 起已废弃,已不推荐使用。

虽然目前即使小程序基础库版本为2.22.0,也能正常使用。但是不确定未来哪天,在更新的基础库中,该方法被删除。这样就会带来项目上的隐患。

所以需要自己去实现arrayBuffer转为base64这一过程。

探索失败的过程

  • new FileReader()在小程序中无法进行使用。无法使用new FileReader()实例中的readAsDataURL方法将数据转为base64。如果不熟悉该方法,可以查看FileReader介绍

  • URL.createObjectURL在小程序中无法使用。无法使用该方法将数据转为在内存中的地址,进而能被image标签进行引用。如果不熟悉该方法,可以查看URL.createObjectURL讲解

  • window.btoa在小程序中无法使用。无法将文本直接转为base64格式。

好了,条条大路都被阻断了。那就该自己铺路搭桥了。

卡壳的arrayBuffer转base64

问题的起始条件有arrayBuffer数据,期望结果是最终形成base64格式数据。那开始进行求解。

首先我们得来说说arrayBuffer这回事。

在JavaScript中,有一个很常用的引用数据类型Array,你可以在里面放字符串、数字、对象、布尔值等等等等。它存放在堆中,可以自由增减。

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。它是一个字节数组,通常在其他语言中称为“byte array”。它的诞生就是为了解决一个问题:操作二进制数据。

只由0和1组成的二进制数据往往是非常巨大的,上千个字节可以说司空见惯,传统的Array这时候处理起二进制数据起来就显得非常低效,所以ArrayBuffer出现了,它作为一块专用的内存区域存放在栈中,取数据非常快。

我们现在通过new ArrayBuffer(10)初始化一个buffer实例,看看会得到什么。

let buffer = new ArrayBuffer(10);console.log(buffer);// 在控制台上显示如下ArrayBuffer(10)byteLength: 10[[Prototype]]: ArrayBuffer[[Int8Array]]: Int8Array(10)[[Uint8Array]]: Uint8Array(10)[[Int16Array]]: Int16Array(5)[[ArrayBufferByteLength]]: 10[[ArrayBufferData]]: 1367

可以看到在ArrayBuffer中,主要存放了几个“视图”,Int8Array表示8位有符号整数数组,Int16Array表示16位有符号整数数组,Uint8Array则表示8位无符号整数数组。

当然,如果比如说我们想取出Int8Array这个数组来,是不能直接通过buffer.Int8Array来取的。这是因为ArrayBuffer不能直接通过下标去读写,我们需要把它转成一个类型化数组(TypedArray)。

你不能直接操作 ArrayBuffer 的内容,而是要通过类型数组对象或 DataView 对象来操作,它们会将缓冲区中的数据表示为特定的格式,并通过这些格式来读写缓冲区的内容。

const myTypedArray = new Uint8Array(buffer)

转化完之后,我们我们不仅可以通过下标去对类型化数组进行索引,也可以获取其length,当然TypedArray仍与普通的Array存在细微的区别,那就是假设我们用超出边界的索引语法去获取数组元素时,TypedArray并不会去原型链中进行查找。

现在我们已经拿到了这个类型化数组,是时候把它转成普通字符串了。看看String.fromCharCode这个函数,它接受的参数为一堆代码单元序列,输出一个普通字符串。而我们刚刚得到的类型化数组,里面存放的正是代码单元。

const str = String.fromCharCode(...myTypedArray)

这里我们用拓展运算符...把类型数组的代码单元解出来,一次性转完,得到一个普通的字符串。

最后,我们需要借助一个window对象的方法,也就是btoa方法,它的作用是:把一个普通字符串编码成base-64格式的字符串。

上面看似很好,但是在最后一步,btoa,在小程序中是没有该方法的去使用的。需要自己去实现btoa这个方法。

关键点btoa的实现

因为该函数,在浏览器中已经实现,所以更多使用在小程序及node环境中。所以总体以module.exports进行方法的输出,以require形式进行引入。

输出方法

module.exports = {  btoa: ...,  atob: ...}

引入文件

const { btoa } =  require('./base64')

base64.js

var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",  a256 = '',  r64 = [256],  r256 = [256],  i = 0;var UTF8 = {    encode: function (strUni) {    // use regular expressions & String.replace callback function for better efficiency    // than procedural approaches    var strUtf = strUni.replace(/[\u0080-\u07ff]/g, // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz      function (c) {        var cc = c.charCodeAt(0);        return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f);      })      .replace(/[\u0800-\uffff]/g, // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz        function (c) {          var cc = c.charCodeAt(0);          return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f);        });    return strUtf;  },    decode: function (strUtf) {    // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!    var strUni = strUtf.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, // 3-byte chars      function (c) { // (note parentheses for precence)        var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f);        return String.fromCharCode(cc);      })      .replace(/[\u00c0-\u00df][\u0080-\u00bf]/g, // 2-byte chars        function (c) { // (note parentheses for precence)          var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f;          return String.fromCharCode(cc);        });    return strUni;  }};while (i < 256) {  var c = String.fromCharCode(i);  a256 += c;  r256[i] = i;  r64[i] = b64.indexOf(c);  ++i;}function code(s, discard, alpha, beta, w1, w2) {  s = String(s);  var buffer = 0,    i = 0,    length = s.length,    result = '',    bitsInBuffer = 0;  while (i < length) {    var c = s.charCodeAt(i);    c = c < 256 ? alpha[c] : -1;    buffer = (buffer << w1) + c;    bitsInBuffer += w1;    while (bitsInBuffer >= w2) {      bitsInBuffer -= w2;      var tmp = buffer >> bitsInBuffer;      result += beta.charAt(tmp);      buffer ^= tmp << bitsInBuffer;    }    ++i;  }  if (!discard && bitsInBuffer > 0) result += beta.charAt(buffer << (w2 - bitsInBuffer));  return result;}var Plugin = function (dir, input, encode) {  return input ? Plugin[dir](input, encode) : dir ? null : this;};Plugin.btoa = Plugin.encode = function (plain, utf8encode) {  plain = Plugin.raw === false || Plugin.utf8encode || utf8encode ? UTF8.encode(plain) : plain;  plain = code(plain, false, r256, b64, 8, 6);  return plain + '===='.slice((plain.length % 4) || 4);};Plugin.atob = Plugin.decode = function (coded, utf8decode) {  coded = coded.replace(/[^A-Za-z0-9\+\/\=]/g, "");  coded = String(coded).split('=');  var i = coded.length;  do {    --i;    coded[i] = code(coded[i], true, r64, a256, 6, 8);  } while (i > 0);  coded = coded.join('');  return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded;};module.exports = {  btoa: Plugin.btoa,  atob: Plugin.atob}

修成正果

有时候后台把图片资源通过arrayBuffer传给前端,这时候为了能正常显示,我们还需要在转化的base64字符串前面拼接上data:image/jpeg;base64,

所以我们整理一下,可以得出这样一个函数:

const { btoa } =  require('./base64')const arrayBufferToBase64Img = (buffer) => {  const str = String.fromCharCode(...new Uint8Array(buffer));  return `data:image/jpeg;base64,${btoa(str)}`;}

整个流程如下:

得到一个ArrayBuffer ---> 转成类型化数组以正常读取(Uint8Array) --> 转成普通字符串(String.fromCharCode) --> 转成base64字符串(btoa)

以上是“js怎么实现小程序wx.arrayBufferToBase64方法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

js怎么实现小程序wx.arrayBufferToBase64方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

js怎么实现小程序wx.arrayBufferToBase64方法

这篇文章主要为大家展示了“js怎么实现小程序wx.arrayBufferToBase64方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js怎么实现小程序wx.arrayBufferToBas
2023-06-29

js怎么实现实现微信小程序简洁登录页面

这篇“js怎么实现实现微信小程序简洁登录页面”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“js怎么实现实现微信小程序简洁登录
2023-06-26

小程序怎么实现洗牌算法

本篇内容介绍了“小程序怎么实现洗牌算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!洗牌算法Fisher–Yates shuffle 算法由
2023-06-19

小程序怎么实现2048小游戏

这篇文章主要介绍“小程序怎么实现2048小游戏”,在日常操作中,相信很多人在小程序怎么实现2048小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序怎么实现2048小游戏”的疑惑有所帮助!接下来,请跟
2023-06-26

微信小程序怎么实现数据共享与方法共享

微信小程序怎么实现数据共享与方法共享,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。全局数据共享 Mobox原生小程序开发中我们可以通过 mobx-miniprogram 配
2023-06-26

SpringBoot怎么实现点餐小程序

这篇文章主要介绍了SpringBoot怎么实现点餐小程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么实现点餐小程序文章都会有所收获,下面我们一起来看看吧。一,功能介绍本点单系统主要是基
2023-07-02

小程序怎么实现轮播图

这篇文章主要介绍“小程序怎么实现轮播图”,在日常操作中,相信很多人在小程序怎么实现轮播图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序怎么实现轮播图”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!使用
2023-06-26

小程序怎么实现点餐小程序购物车效果

这篇文章主要讲解了“小程序怎么实现点餐小程序购物车效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“小程序怎么实现点餐小程序购物车效果”吧!自己的第一个点餐小程序,主要包括左右菜单联动、点击
2023-06-26

微信小程序tabBar怎么实现

这篇文章主要介绍“微信小程序tabBar怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序tabBar怎么实现”文章能帮助大家解决问题。tabBar先创建几个页面,要注意文件夹和页面名
2023-06-26

猫眼电影小程序api的实现方法

这篇文章主要介绍“猫眼电影小程序api的实现方法”,在日常操作中,相信很多人在猫眼电影小程序api的实现方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”猫眼电影小程序api的实现方法”的疑惑有所帮助!接下来
2023-06-26

微信小程序骨架屏的实现方法

本文主要介绍了微信小程序骨架屏的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-17

C++ SOCKET多线程实现聊天小程序的方法

本篇内容主要讲解“C++ SOCKET多线程实现聊天小程序的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ SOCKET多线程实现聊天小程序的方法”吧!本文实例为大家分享了C++ SO
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录