10分钟带你了解什么是ArrayBuffer?

news2024/11/18 7:39:11

前言

很多时候我们前端开发是用不到 ArrayBuffer 的,但是用不到 ArrayBuffer 不代表我们不需要了解这个东西。本文就围绕 ArrayBuffer 来讲一下相关知识,大概需要10分钟左右就可以读完本文。

什么是ArrayBuffer?

描述

ArrayBuffer 对象用来表示通用的、固定长度的原始二进制数据缓冲区。ArrayBuffer MDN

ArrayBuffer具有如下的特性

1.ArrayBuffer 是固定长度连续内存空间的引用;
2.ArrayBuffer 对象代表存储一段二进制数据的内存;
3.ArrayBuffer 并不能直接读写,只能通过视图(Typed Array View | Data View)来读写;

创建一个Buffer

ArrayBuffer 接收一个 length 参数用于描述要创建的ArrayBuffer的大小,单位是字节。length的值应该是大于0的整数,但是如果你传入的是一个小数,那么会自动向下取整去创建。

// 创建一个长度为0的buffer
const buffer_0 = new ArrayBuffer(0); // success
// 创建一个长度为8的buffer
const buffer_1 = new ArrayBuffer(8); // success
// 创建一个长度为3的buffer
const buffer_2 = new ArrayBuffer(3); // success 

根据传入不同的长度,其视图也是不一样的(后面视图部分会详细介绍不同视图的区别),根据下图可以看到,buffer实例具有byteLength属性可以获取长度。

判断是否是视图实例

ArrayBuffer有两种视图用于提供读取、写入的能力,一种是Typed Array 类型视图一种是Data View。当我们需要判断一个参数是否是符合条件的视图时,可以用isView这个方法。具体判断如下:

ArrayBuffer.isView(new Uint8Array()); // true
ArrayBuffer.isView(buffer); // false 

Typed Array 和 Data View 的区别?

什么是Typed Array ?

Typed Array是一个拥有9种类型的视图集合,每一种都是一个构造函数。

Int8Array:8位有符号整数,长度1个字节,范围是[-128 ~ 128]

Uint8Array:8位无符号整数,长度1个字节,范围是[0 ~ 255)

Uint8ClampedArray:8位无符号整数,长度1个字节,溢出处理不同。

Int16Array:16位有符号整数,长度2个字节,范围是[-32768 ~ 32767]

Uint16Array:16位无符号整数,长度2个字节,范围是[0 ~ 65536)

Int32Array:32位有符号整数,长度4个字节。

Uint32Array:32位无符号整数,长度4个字节。

Float32Array:32位浮点数,长度4个字节。

Float64Array:64位浮点数,长度8个字节。

我们从开文知道ArrayBuffer存储的是字节长度,而一个字节是8位,同时根据上面每个视图的长度得知总的位数,因此可以推导出来每一个视图的取值范围具体是多少。具体的操作逻辑如下:

// 创建一个长度为8的buffer
const buffer = new ArrayBuffer(8);
// 创建一个无符号8位视图
const view = new Uint8Array(buffer);
// 赋值
view[0] = 1;
view[1] = 2; 

结果如下:

从上面的结果中可以看到,Uint8Array 的结果是咱们赋值时候的具体值,但是 Int16Array 为什么会是513呢?我们接着往下看:

当我们执行 view[0] = 1 时,我们在内存中开辟了一个字节的内存,具体如下图:

当我们执行 view[0] = 2 时,我们在内存中开辟了一个字节的内存,具体如下图:

以上是存放在Uint8Array时候的,视图中每一个位置存放一个字节的数值。但是如果转换成Int16Array的时候,一个位置要存放2个字节的数值。所以其中第0个位置和第1个位置的值需要放置在一起,通过下图计算可得上图的513。

什么是Data View ?

相较于TypedArray,DataView对ArrayBuffer的操作更加灵活。因为TypedArray操作ArrayBuffer时每个元素占用的字节大小是固定的,要么8位要么16位或者32位等等。而DataView可以从ArrayBuffer中自由的读写多种数据类型,从而控制字节顺序。

创建一个Data View

const buffer = new ArrayBuffer(8);
const view = new DataView(buffer); 

创建视图后如下,可以看到原型上和(Typed View)类型视图是有区别的。

设置数值

原型上有以下方法用于写入和读取,

getInt8/setInt8

getUint8/setUint8

getInt16/setInt16

getUint16/setUint16

getInt32/setInt32

getUint32/setUint32

getFloat32/setFloat32

getFloat64/setFloat64

赋值代码如下:

const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setInt8(0, 1);
view.setInt8(1, 2);
view.setInt8(2, 100);
view.setInt8(5, 100); 

效果如下:

ArrayBuffer与Blob的区别

ArrayBuffer对象用来表示通用的、固定长度的原始二进制数据缓冲区,Blob表示一个不可变、原始数据的类文件对象。

Blob类型只有slice方法,用于返回一个新的Blob对象,包含了原Blob对象中指定范围内的数据。

对比发现,ArrayBuffer的数据,是可以按照字节去操作的,而Blob的只能作为一个对象去处理。所以ArrayBuffer相对于Blob更接近真实的二进制,更底层。

ArrayBuffer与Blob的相互转化

var buffer = new ArrayBuffer(16)
var blob = new Blob([buffer]) 
var blob = new Blob([1,2,3,4,5])
var reader = new FileReader()
reader.readAsArrayBuffer(blob)
reader.onload = function(e) {// e.target.result 即为ArrayBuffer
} 

ArrayBuffer使用场景

1.Ajax

传统上,服务器通过 AJAX 操作只能返回文本数据,即responseType属性默认为textXMLHttpRequest第二版XHR2允许服务器返回二进制数据,这时分成两种情况。如果明确知道返回的二进制数据类型,可以把返回类型(responseType)设为arraybuffer;如果不知道,就设为blob

let xhr = new XMLHttpRequest();
xhr.open('GET', someUrl);
xhr.responseType = 'arraybuffer';
xhr.onload = function () {let arrayBuffer = xhr.response;// ···
};
xhr.send(); 

2.Canvas

网页Canvas元素输出的二进制像素数据,就是 TypedArray 数组。

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const uint8ClampedArray = imageData.data; 

需要注意的是,上面代码的uint8ClampedArray虽然是一个 TypedArray 数组,但是它的视图类型是一种针对Canvas元素的专有类型Uint8ClampedArray。这个视图类型的特点,就是专门针对颜色,把每个字节解读为无符号的 8 位整数,即只能取值 0 ~ 255,而且发生运算的时候自动过滤高位溢出。这为图像处理带来了巨大的方便。

3.WebSocket

WebSocket可以通过ArrayBuffer,发送或接收二进制数据。

let socket = new WebSocket('ws://127.0.0.1:8081');
socket.binaryType = 'arraybuffer';
// Wait until socket is open
socket.addEventListener('open', function (event) {// Send binary dataconst typedArray = new Uint8Array(4);socket.send(typedArray.buffer);
});
// Receive binary data
socket.addEventListener('message', function (event) {const arrayBuffer = event.data;// ···
}); 

4.Fetch API

Fetch API 取回的数据,就是ArrayBuffer对象。

fetch(url)
.then(function(response){return response.arrayBuffer()
})
.then(function(arrayBuffer){// ...
}); 

5.File API

如果知道一个文件的二进制数据类型,也可以将这个文件读取为ArrayBuffer对象。

const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function () {const arrayBuffer = reader.result;// ···
}; 

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Paramiko库讲解

目录 基本概念 Paramiko组件架构 Key handing类 Transport类 SFTPClient类 SSHClient类—主要使用的类 Python编写完整例子 基本概念 Paramiko是Python实现SSHv2协议的模块,支持口令认证和公钥认证两种方式 通过Paramiko可以实现通过Python进行安全的远程命…

Html5网页播放器的同层播放功能

Html5网页播放器的同层播放功能&#xff1a; 在Android手机上使用H5播放视频时&#xff0c;大多数的国内浏览器厂商都会在视频播放时劫持<video>标签&#xff0c;使用浏览器自带的播放器播放视频&#xff0c;而且播放器会处于最高层级&#xff0c;视频上面无法显示其它h…

数影周报:字节跳动员工违规获取TikTok用户数据,阿里组织调整

本周看点&#xff1a;字节跳动员工违规获取TikTok用户数据&#xff1b;钉钉宣布用户数破6 亿&#xff1b;阿里组织调整&#xff1b;星尘数据完成 5000 万元 A 轮融资...... 数据安全那些事 字节跳动员工违规获取TikTok用户数据 字节跳动旗下热门应用TikTok日前曝出严重风波。字…

郭德纲落选,冯巩、赵炎上榜,国家非物质文化遗产传承人评选落幕

根据国家广电局26日消息&#xff0c;经过激烈的竞争&#xff0c;国家非物质文化遗产传承人评选工作&#xff0c;已经顺利落下帷幕。 在此次评选活动当中&#xff0c;评委会一致审议通过&#xff0c;著名相声演员冯巩和赵炎&#xff0c;被评为了非物质文化遗产传承人。而呼声很高…

Linux | 进程理解 | 进程的终止,等待与替换 | 环境变量的介绍与使用

文章目录进程终止进程终止的方法操作系统是怎么终止进程的&#xff1f;进程等待为何需要等待进程&#xff1f;怎么等待一个进程&#xff1f;非阻塞式等待进程替换什么是进程替换&#xff1f;为什么要进程替换&#xff1f;怎样替换一个进程&#xff1f;exec系列函数环境变量用命…

企业微信开发(一)常见问题收集及解决方案

持续收集企业微信开发中遇到疑难杂症&#xff0c;并给出相应的解决方案 一、好友上限&#xff08;84061&#xff09; 背景&#xff1a;达到添加好友数上限的员工&#xff0c;新增自动通过的好友&#xff0c;无法拉取到客户信息。 根因&#xff1a;企业微信业务限制 员工添加的…

启辰全面转型新能源,能否创造风日产第二增长曲线?

随着新能源汽车市占率的不断增长&#xff0c;传统汽车大厂加大了在新能源汽车领域的布局。这其中决心最大的当属东风日产&#xff0c;第二品牌——“启辰”全面转型新能源&#xff0c;告别纯然有车开发。 12月30日&#xff0c;以“新科技 新生活”为主题的第二十届广州车展盛大…

Linux系统定时信号SIGALRM的触发与alarm函数的使用

1、 定时信号SIGALRM的用途 在编程的过程中&#xff0c;很多时候我们需要为程序设置一个闹钟&#xff0c;然后到了闹钟设定的时刻然后再去采取相关的操作。比如进行socket编程时&#xff0c;如果客户端长时间没有与服务器进行交互&#xff0c;需要服务器在一定时间之后主动关闭…

Linux | 权限管理

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

Vue(二)

1. 模板语法 1.1 实现效果 1.2 模板的理解 不加v-bind就相当于直接把双引号里的东西当成字符串执行&#xff0c;加了bind双引号里的东西就当成js表达式执行 v-bind:可以简写成&#xff1a; 起始标签和结束标签中间夹着的就是标签体 <!DOCTYPE html> <html><hea…

【数据结构】插入排序、希尔排序、冒泡排序、选择排序

文章目录 一、直接插入排序 思想 程序代码 时间复杂度 二、希尔排序 思想 程序代码 时间复杂度 三、冒泡排序 思想 程序代码 时间复杂度 四、选择排序 思想 程序代码 时间复杂度 一、直接插入排序 思想 直接插入排序有些类似于我们玩扑克牌时的整理牌序动作&a…

目标检测中常见的神经网络组成层------Pytorch

物体检测中常见的神经网络组成层 文章目录物体检测中常见的神经网络组成层卷积层激活函数层池化层Dropout层全连接层常见的物体检测算法常用卷积层、池化层、全连接层、激活函数层、Dropout层。 卷积层 CNN–各层的介绍_Miracle Fan的博客-CSDN博客_cnn各层介绍 在pytorch中…

Python3入门基础(08)一个函数

Python3 函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0…

Windows 11 连接 hercules zOS Websphere MQ 配置

基本配置 zOS v1.10 基本配置可以先参考下面教程 ubuntu 编译 hercules 主机安装 z/OS 教程 zOS MQ 版本为 CSQ700 Windows 11 IBM MQ 版本为最新 9.x IBM MQ 官网有开发者版本可以免费下载&#xff0c;档名如下 mqadv_dev931_windows.zip (全名为 IBM MQ Advanced for Devel…

kafka — 2、基础环境搭建

前述 kafka的运行依赖于zooKeeper&#xff0c;所以在搭建kafka的环境之前需要搭建zookeeper环境。 zooKeeper&#xff1a; ZooKeeper是一个分布式协调服务&#xff0c;它的主要作用是为分布式系统提供一致性服务&#xff0c;可以保证数据在集群间的事务一致性&#xff0c;提供…

Volatile不保证原子性

目录 前言 原子性 代码测试 为什么出现数值丢失 如何解决 其它解决方法 字节码指令表 前言 通过前面对JMM的介绍&#xff0c;我们知道&#xff0c;各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。 这就可能存在一…

Java Iterator(迭代器)

Java Iterator&#xff08;迭代器&#xff09;不是一个集合&#xff0c;它是一种用于访问集合的方法&#xff0c;可用于迭代 ArrayList 和 HashSet 等集合。 Iterator 是 Java 迭代器最简单的实现&#xff0c;ListIterator 是 Collection API 中的接口&#xff0c; 它扩展了 I…

微信小程序和ros2进行通信

微信小程序和ros2进行通信环境配置ubuntu下安装ros2ubuntu安装mqtt库windows安装微信开发者工具主要功能模块介绍ROS2基础程序讲解微信小程序基础程序讲解编译及运行ros2程序编译及运行微信小程序主要事项ROS2做为一款优秀的机器人操作系统软件&#xff0c;其搭载了丰富的机器人…

深耕低代码领域20年,这个老牌低代码平台有多靠谱

编者按&#xff1a;市面上低代码平台多如牛毛&#xff0c;用户在选型低代码平台时该如何甄别&#xff1f;本文通过介绍20年的老品牌低代码平台的特性&#xff0c;展示了优秀第低代码平台的魅力。 关键词&#xff1a;老厂商&#xff0c;私有化部署&#xff0c;源码交付&#xf…

实现effect的stop和onStop功能

06_实现effect的stop和onStop功能 一、实现stop &#xff08;一&#xff09;单元测试 it(stop, () > {let dummy;const obj reactive({ prop: 1 });const runner effect(() > {dummy obj.prop;});obj.prop 2;expect(dummy).toBe(2);stop(runner);obj.prop 3;expe…