当前位置: 首页 > news >正文

深入浅出理解ArrayBuffer对象TypedArray和DataView视图

目录

举例理解

1. ArrayBuffer对象

2. TypedArray

3. DataView

总结

具体讲解 

1. ArrayBuffer对象

2. TypedArray

3. DataView

注意事项


举例理解

先举个简单的例子理解ArrayBuffer对象TypedArray和DataView视图的概念和之间的关系

1. ArrayBuffer对象

想象一个场景:你有一个装满水的长水管,这个水管就是一个ArrayBuffer。水管里的水是二进制数据,而水管本身则是用来存储这些数据的地方。

特点

  • 固定长度:这个水管一旦制作好了,长度就不能再改变。
  • 不能直接操作:你不能直接打开水管去喝水(即不能直接读取或修改二进制数据)。但是,你可以通过一些工具来帮助你。
2. TypedArray

继续上面的场景:现在,你想从水管里取水,但是水管太细了,手伸不进去。于是,你使用了一个特制的杯子(TypedArray),这个杯子有各种大小,可以对应水管里的不同水量。

类型

  • Int8Array:像是一个小杯子,每次只能取8位(1字节)的水。
  • Uint16Array:像是一个大杯子,每次可以取16位(2字节)的水。
  • ……以此类推。

用途

  • 当你需要按照特定的量(类型)来取水(读取数据)或倒水(写入数据)时,就可以使用对应的杯子(TypedArray)。
3. DataView

再次回到场景:但有时候,你可能想从水管的某个特定位置取一点水,或者同时取几种不同量的水。这时,使用杯子就不太方便了,因为杯子只能从头开始取水。

于是,你使用了一个吸管(DataView)。吸管可以让你选择从水管的哪个位置开始取水,以及取多少。

特点

  • 灵活:你可以决定从水管的哪个位置开始,以及取多少水。
  • 复杂:相对于杯子(TypedArray),使用吸管(DataView)可能需要更多的技巧和注意。
总结
  • ArrayBuffer就像是一个装满水的长水管,用来存储二进制数据。
  • TypedArray就像是一个特制的杯子,用来按照特定的量(类型)来取水或倒水。
  • DataView则像是一个吸管,可以灵活地选择从水管的哪个位置开始取水,以及取多少。
  • 如果ArrayBuffer中存储的二进制类型单一使用TypedArray反之使用DataView

通过以上例子相信你已经大致了解了这三者之间的关系,接下来具体看一下

具体讲解 

1. ArrayBuffer对象

用途与特性

ArrayBuffer对象是一个通用的、固定长度的原始二进制数据缓冲区。它常被用于存储和处理大量的二进制数据,比如图像、音频文件、网络通信中的数据等。

  • 固定长度:一旦创建,ArrayBuffer的大小就不能改变。这意味着,你需要在创建时确定所需的缓冲区大小。
  • 不能直接操作:你不能直接读写ArrayBuffer的内容。相反,你需要通过某种类型数组对象(如TypedArray)或DataView对象来访问和修改其中的数据。

创建与使用

你可以使用ArrayBuffer构造函数来创建一个新的ArrayBuffer对象,指定所需的字节长度作为参数。

const buffer = new ArrayBuffer(16); // 创建一个16字节的ArrayBuffer
2. TypedArray

用途与特性

TypedArray是一种特殊的数组,用于以特定的数值类型来读写ArrayBuffer的内容。它提供了多种类型,如Int8ArrayUint8ArrayFloat32Array等,用于存储不同范围和精度的数值。

  • 与ArrayBuffer关联TypedArray对象会关联一个ArrayBuffer,并且其元素会对应到ArrayBuffer的特定部分。
  • 类型安全:每个TypedArray都有一个固定的元素类型,这确保了存储的数据类型的一致性。

创建与使用

你可以通过传入一个ArrayBuffer对象来创建一个TypedArray

const buffer = new ArrayBuffer(16);
const int32View = new Int32Array(buffer); // 创建一个关联到buffer的Int32Array视图

你还可以使用TypedArray.set()方法来复制数据,或者使用.get()方法来获取数据。

3. DataView

用途与特性

DataView提供了一种用于读写ArrayBuffer内容的低级接口。与TypedArray不同,DataView允许你以任意顺序和字节序来读写ArrayBuffer的不同部分

  • 灵活性:你可以指定偏移量和字节序(大端或小端)来读取或写入数据。
  • 低级操作:相比于TypedArrayDataView提供了更底层的访问方式,但这也意味着操作起来可能更复杂一些。

创建与使用

你可以通过传入一个ArrayBuffer对象来创建一个DataView

const buffer = new ArrayBuffer(16);
const view = new DataView(buffer); // 创建一个关联到buffer的DataView

然后,你可以使用DataView提供的各种方法来读取或写入数据,如.getInt8().setUint16()等。

注意事项
  • 当使用TypedArrayDataView来读写ArrayBuffer时,要确保不要越界访问,否则可能会导致不可预测的行为。
  • ArrayBufferTypedArrayDataView共享相同的底层二进制数据。因此,对一个视图所做的修改会影响到其他视图和原始的ArrayBuffer
  • 当不再需要ArrayBufferTypedArrayDataView时,最好显式地解除对它们的引用,以便垃圾回收器能够回收它们占用的内存。

相关文章:

深入浅出理解ArrayBuffer对象TypedArray和DataView视图

目录 举例理解 1. ArrayBuffer对象 2. TypedArray 3. DataView 总结 具体讲解 1. ArrayBuffer对象 2. TypedArray 3. DataView 注意事项 举例理解 先举个简单的例子理解ArrayBuffer对象TypedArray和DataView视图的概念和之间的关系 1. ArrayBuffer对象 想象一个场景…...

人工智能 - 服务于谁?

人工智能服务于谁? 人工智能服务于生存,其最终就是服务于战争(热战、技术战、经济战) 反正就是为了活着而战的决策。 既然人工智能所有结果,来自大数据的分挖掘(分析)也就是数据的应用&#x…...

软考高级架构师:嵌入式系统的内核架构

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…...

分布式锁实战

4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行&#x…...

【VMware Workstation】启动虚拟机报错“此主机支持 AMD-V,但 AMD-V 处于禁用状态”

问题出现步骤: 打开虚拟机: 然后报错: “此主机支持 AMD-V,但 AMD-V 处于禁用状态。 如果已在 BIOS/固件设置中禁用 AMD-V,或主机自更改此设置后从未重新启动,则 AMD-V 可能被禁用。 (1) 确认 BIOS/固件设…...

非关系型数据库(缓存数据库)redis的基础认知与安装

目录 一.关系型数据库和非关系型数据库 关系型数据库 非关系型数据库 关系数据库与非关系型数据库的区别 ①非关系数据 关系型数据库 非关系型数据库产生背景 数据存储流向 非关系型数据库 关系数据库 二.redis的简介 1.概念 2.Redis 具有以下几个优点: 3.Redi…...

Go语言如何处理文件

1.文件的重要性 文件不过是硬盘中的数据,看起来好像没什么了不起,但实际上,文件能够让程序员管理配置、存储程序的状态乃至从底层操作系统中读取数据。 UNIX型操作系统的一个重要特征是,将一切都视为文件。这意味着在操作系统看来,从键盘到打印机的所有东西都可像文件那样…...

Java基础知识总结(42)

(1)Java关键字的相关知识进行了复习 考试过程中“main”是主方法名,而不是Java关键字 (2)类型转换 当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升,所有的b…...

C++ | Leetcode C++题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; class Solution { public:string convert(string s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}string ans;int t r * 2 - 2;for (int i 0; i < r; i) { // 枚举矩阵的行for (int j 0; j i &l…...

JavaEE——手把手教你实现简单的 servlet 项目

文章目录 一、什么是 Servlet二、创建一个简单的 Servlet 程序1. 创建项目2.引入依赖3. 创建目录4.编写代码5. 打包程序6. 部署7.验证整体过程总结 三、使用 Smart Tomcat 插件简化项目创建四、创建项目时可能遇到的几个问题。 一、什么是 Servlet Servlet 是一种实现 动态页面…...

X年后,ChatGPT会替代底层程序员吗?

能不能替代&#xff0c;真的很难说&#xff0c;因为机器换掉人&#xff0c;这其实是一个伦理问题。 其实说白了&#xff0c;任何行业在未来都会被AI或多或少的冲击到&#xff0c;因为ChatGPT做为一个可以持续提升智能的AI&#xff0c;在某些方面的智能程度超过人类并不是什么难…...

OpenAI 推出新网络爬虫GPTBot,为GPT-5做准备

目录 一、GPTBot是什么&#xff1f;它是如何工作的&#xff1f;二、GPTBot 与 Google Bot 等搜索引擎网络爬虫有何不同&#xff1f;三、GPTBot 与 Perplexity AI 的网络爬虫有何不同&#xff1f;四、允许 GPTBot 爬取有哪些风险和好处&#xff1f;4.1 允许 GPTBot 的好处4.2 允…...

【Easy云盘 | 第二篇】后端统一设计思想

文章目录 4.1后端统一设计思想4.1.1后端统一返回格式对象4.1.2后端统一响应状态码4.1.3后端统一异常处理类4.1.4StringUtils类4.1.5 RedisUtils类 4.1后端统一设计思想 4.1.1后端统一返回格式对象 com.easypan.entity.vo.ResponseVO Data public class ResponseVO<T> …...

c语言:模拟字符串拷贝功能(strcpy),面试题

面试题&#xff1a;优化中的优化&#xff08;10分满分&#xff09; 字符串拷贝:是将一个字符串的内容复制到另一个字符串中的操作。 运用函数模拟字符串拷贝&#xff1a;&#xff08;5分&#xff09; 模拟字符串拷贝 #include <stdio.h> void my_strcpy(char* dest, c…...

信创环境ES索引管理脚本:close, delete

背景 elastic-curator在信创环境无现成安装包&#xff0c;且现成一般无法联网&#xff0c;此时通过脚本管理es索引是最佳选择。 1, 脚本内容: es-close-del.sh [rootmyprojtest001 ]# cat es-close-del.sh #/bin/bash#elastic地址 ELASTIC_URL127.0.0.1:9200 #默认的删除时间…...

torch-v1.3.1-build

编译pytorch-v1.3.1 python版本>3.8会收到报错 error: cannot convert ‘std::nullptr_t’ to ‘Py_ssize_t’ {aka ‘long int’} in initialization, 参见: https://github.com/pytorch/pytorch/issues/28060 简单办法是用python3.7 wget https://mirrors.tuna.tsingh…...

C语言宏定义笔记

把宏名全部大写&#xff0c;函数名不要全部大写。注意宏定义表示数据类型和用 typedef 定义数据说明符的区别。宏定义只是简单的字符串替换&#xff0c;由预处理器来处理&#xff1b; typedef 是在编译阶段由编译器处理的&#xff0c;它并不是简单的字符串替换&#xff0c;而给…...

设计模式:生活中的观察者模式

想象你在社交媒体上关注&#xff08;订阅&#xff09;了一个名人或新闻频道&#xff08;主题&#xff09;。一旦他们发布新内容&#xff0c;所有关注者&#xff08;观察者&#xff09;都会收到通知。这个过程就很像观察者模式的工作原理。 生活场景类比 主题&#xff08;Subj…...

Qt实现Kermit协议(四)

3 实现 3.3 KermitRecvFile 该模块实现了Kermit接收文件功能。 序列图如下&#xff1a; 3.3.1 KermitRecvFile定义 class QSerialPort; class KermitRecvFile : public QObject, public Kermit {Q_OBJECT public:explicit KermitRecvFile(QSerialPort *serial, QObject *…...

苏州金龙助力旅游客运加速蜕变

近日&#xff0c;北京铭悦旅游客运有限公司又迎来一批苏州金龙海格纯电动客车。&#xff08;以下简称北京铭悦旅游&#xff09;总经理郭保生在车辆交付时说到&#xff0c;“为迎接强劲复苏的旅游市场&#xff0c;要求旅游客运向绿色客运转型&#xff0c;以及人民对品质生活、美…...

从零搭建一个HarmonyOS版GitCode客户端:我的React Native项目目录结构与配置心得

从零搭建HarmonyOS版GitCode客户端的工程化实践 作为一名长期耕耘在跨平台开发领域的技术实践者&#xff0c;我最近完成了基于React Native的HarmonyOS版GitCode客户端开发。这个项目让我深刻体会到&#xff0c;良好的项目结构设计比功能实现更重要——它直接影响团队协作效率和…...

别再死记硬背了!用Vivado工具链图解FPGA底层:CLB、SLICE与LUT到底怎么连的?

用Vivado工具链图解FPGA底层&#xff1a;从代码到硬件的可视化之旅 当你在Vivado中编写完一段Verilog代码&#xff0c;点击综合按钮后&#xff0c;那些抽象的硬件描述究竟是如何变成FPGA芯片上实实在在的电路连接的&#xff1f;对于初学者来说&#xff0c;CLB、SLICE、LUT这些概…...

Axure RP中文语言包:3分钟快速汉化你的原型设计工具

Axure RP中文语言包&#xff1a;3分钟快速汉化你的原型设计工具 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包&#xff0c;不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 对于…...

如何通过League-Toolkit实现英雄联盟全流程效率提升?

如何通过League-Toolkit实现英雄联盟全流程效率提升&#xff1f; 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联…...

CLIP Prompt Tuning实战指南:如何用少量样本优化多模态模型性能

最近在做一个多模态内容理解的项目&#xff0c;用到了CLIP模型。大家都知道CLIP很强大&#xff0c;但真到了要让它适应我们自己的业务数据时&#xff0c;传统全量微调&#xff08;Full Fine-tuning&#xff09;那套方法就有点让人头疼了——动辄几十GB的显存需求&#xff0c;还…...

基于Qwen-2.5-VL与RAG的智能客服系统实战:从微调优化到生产部署

最近在做一个智能客服项目&#xff0c;客户那边对回答的准确性和时效性要求特别高。传统的规则引擎早就力不从心了&#xff0c;而直接用通用大模型&#xff0c;又经常“一本正经地胡说八道”&#xff0c;或者回答一些过时的信息。经过一番折腾&#xff0c;我们最终选择了 Qwen-…...

ChatTTS 量化模型实战:从模型压缩到推理效率提升

最近在部署 ChatTTS 模型时&#xff0c;遇到了一个很实际的问题&#xff1a;模型虽然效果不错&#xff0c;但体积大、推理慢&#xff0c;在资源受限的边缘设备上跑起来非常吃力。显存动不动就占好几个G&#xff0c;生成一段语音的等待时间也让人着急。为了解决这个问题&#xf…...

实战分享:如何用OmniPeek和TL-WDN7200H网卡高效抓取WiFi空口数据包(附信道选择技巧)

实战分享&#xff1a;如何用OmniPeek和TL-WDN7200H网卡高效抓取WiFi空口数据包&#xff08;附信道选择技巧&#xff09; 在无线网络分析和安全研究领域&#xff0c;空口数据包捕获是诊断问题、优化性能和发现安全隐患的基础技能。不同于有线网络抓包&#xff0c;无线环境中的信…...

小白必看:Ollama部署translategemma-12b-it图文翻译模型完整流程

小白必看&#xff1a;Ollama部署translategemma-12b-it图文翻译模型完整流程 1. 准备工作与环境搭建 1.1 系统要求与安装Ollama 在开始部署translategemma-12b-it模型前&#xff0c;请确保您的系统满足以下基本要求&#xff1a; 操作系统&#xff1a;支持Windows 10/11&…...

YOLOv8工业部署翻车实录:6类典型报错日志解析,附可直接复用的CI/CD流水线脚本

第一章&#xff1a;YOLOv8工业部署翻车实录&#xff1a;6类典型报错日志解析&#xff0c;附可直接复用的CI/CD流水线脚本模型导出阶段&#xff1a;ONNX Shape Inference 失败 当执行 yolo export modelyolov8n.pt formatonnx opset12 时&#xff0c;常见报错&#xff1a;Runtim…...