兼收并蓄 TypeScript - 进阶: ArrayBuffer

源码 https://github.com/webabcd/TypeScriptDemo
作者 webabcd

兼收并蓄 TypeScript - 进阶: ArrayBuffer

示例如下:

advanced\arrayBuffer.ts

{/*** 1、ArrayBuffer - 内存之中的一段二进制数据,需要通过视图操作数据* 2、TypedArray - 视图,用于操作 ArrayBuffer 对象,TypedArray 的具体类型如下*    Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array* 3、DataView - 视图,用于操作 ArrayBuffer 对象,其可以通过如下方法操作 ArrayBuffer 对象*    setInt8/getInt8, setUint8/getUint8, setInt16/getInt16, setUint16/getUint16, setInt32/getInt32, setUint32/getUint32, setFloat32/getFloat32, setFloat64/getFloat64*/// 实例化 ArrayBuffer 对象,并开辟指定字节数的内存空间let buffer = new ArrayBuffer(32);// slice() - 从指定位置的数据开始复制数据到一个新的 ArrayBuffer 对象let buffer1 = buffer.slice(0);// slice() - 从第 1 个参数指定的位置的数据开始,到第 2 个参数指定的位置的数据结束(不包括本身),将此之间的数据复制到一个新的 ArrayBuffer 对象let buffer2 = buffer.slice(4, 8);// byteLength - 获取 ArrayBuffer 的字节大小// ArrayBuffer.isView() - 判断指定的对象是否是视图console.log(buffer.byteLength, buffer1.byteLength, buffer2.byteLength, ArrayBuffer.isView(buffer));// 32 32 4 false// 实例化 Int32Array 视图,并指定初始数组(会自动根据这个数组创建并关联 ArrayBuffer 对象)let a = new Int32Array([1, 2, 3]);// buffer - 获取 TypedArray 关联的 ArrayBuffer 对象// [index] - 获取或设置 TypedArray 对象的指定位置的数据// length - 数据的元素个数// BYTES_PER_ELEMENT - 数组的每个元素的字节大小// Array.prototype.slice.call() - 将 TypedArray 对象转换为数组对象a[0] = 100;a[1] = 200;console.log(a[0], a[1], a[2], a.length, a.BYTES_PER_ELEMENT, a.buffer.byteLength, ArrayBuffer.isView(a), Array.prototype.slice.call(a));// 100 200 3 3 4 12 true [100, 200, 3]// 各种 TypedArray 类型的元素占用的字节大小console.log(Int8Array.BYTES_PER_ELEMENT, Uint8Array.BYTES_PER_ELEMENT, Int16Array.BYTES_PER_ELEMENT, Uint16Array.BYTES_PER_ELEMENT,Int32Array.BYTES_PER_ELEMENT, Uint32Array.BYTES_PER_ELEMENT, Float32Array.BYTES_PER_ELEMENT, Float64Array.BYTES_PER_ELEMENT);// 1 1 2 2 4 4 4 8// 实例化一个 TypedArray 对象,并关联指定的 ArrayBuffer 对象let c = new Int32Array(buffer); // 8 个元素// 指定需要操作的 ArrayBuffer 对象的起始索引位置,直至结尾let d = new Int32Array(buffer, 4); // 7 个元素// 指定需要操作的 ArrayBuffer 对象的起始索引位置,直至指定的长度(这个长度指的是 TypedArray 对象的元素的个数)let e = new Int32Array(buffer, 4, 2); // 2 个元素// 通过指定元素个数实例化 TypedArray 对象(会自动创建并关联 ArrayBuffer 对象)let f = new Int32Array(4);// 通过指定数组实例化 TypedArray 对象(会自动创建并关联 ArrayBuffer 对象)let g = new Int32Array([1, 2, 3, 4]);// Int32Array.of() - 通过指定数组实例化 TypedArray 对象(会自动创建并关联 ArrayBuffer 对象)let h = Int32Array.of(1, 2, 3, 4);// Int32Array.from() - 通过指定数组实例化 TypedArray 对象(会自动创建并关联 ArrayBuffer 对象)let i = Int32Array.from([1, 2, 3, 4]);console.log(c.length, d.length, e.length, f.length, g.length, h.length, i.length);// 8 7 2 4 4 4 4// TypedArray 包含有大部分的 Array 的方法,具体用法请参见 array 的说明let j = new Int32Array([1, 2, 3, 4]);let k = new Int32Array(4);let l = new Int32Array(6);// set() - 将指定的数组复制过来k.set(h);// set() - 将指定的数组复制过来,第 2 个参数用于指定复制过来的数组从当前数组的哪个位置开始写入l.set(h, 2);console.log(j, k, l);// [1, 2, 3, 4] [1, 2, 3, 4] [0, 0, 1, 2, 3, 4]let m = new Int32Array([1, 2, 3, 4]);// subarray() - 根据关联的 ArrayBuffer 对象复制一份新的且一样的 ArrayBuffer 对象//              subarray() 返回的新的 TypedArray 对象关联的是这个新的 ArrayBuffer 对象//              subarray() 返回的新的 TypedArray 对象操作的是第 1 个参数指定的位置到第 2 个参数指定的位置(不包括本身)之间的元素// 参数可以是负的,负的意思就是从右往左数let n = i.subarray(1, 3);// slice() - 根据第 1 个参数指定的位置到第 2 个参数指定的位置(不包括本身)之间的元素,生成一个新的 ArrayBuffer 对象//           slice() 返回的新的 TypedArray 对象关联的是这个新的 ArrayBuffer 对象//           slice() 返回的新的 TypedArray 对象操作的是整个 ArrayBuffer 对象// 参数可以是负的,负的意思就是从右往左数let o = i.slice(1, 3);console.log(m, n, o, m.buffer.byteLength, n.buffer.byteLength, o.buffer.byteLength);// [1, 2, 3, 4] [2, 3] [2, 3] 16 16 8// 复合视图let p = new ArrayBuffer(24);// ArrayBuffer 对象的 0 - 4(不包括 4)字节由 Uint32Array 对象操作let q = new Uint32Array(p, 0, 1);// ArrayBuffer 对象的 4 - 20(不包括 20)字节由 Uint8Array 对象操作let r = new Uint8Array(p, 4, 16);// ArrayBuffer 对象的 20 - 24(不包括 24)字节由 Float32Array 对象操作let s = new Float32Array(p, 20, 1);// 实例化 DataView 对象,并关联指定的 ArrayBuffer 对象// 还有其他多种实例化 DataView 对象的方式,请参见上面的实例化 TypedArray 对象的说明// 通过 setInt8(), setUint8(), setInt16(), setUint16(), setInt32(), setUint32(), setFloat32(), setFloat64() 设置数据(第 1 个参数指定字节位置,第 2 个参数指定需要设置的值)// 通过 getInt8(), getUint8(), getInt16(), getUint16(), getInt32(), getUint32(), getFloat32(), getFloat64() 获取数据(第 1 个参数指定字节位置)let t = new DataView(buffer);t.setInt32(0, 100);t.setInt32(4, 200);console.log(t.getInt32(0), t.getInt32(4), t.byteLength, ArrayBuffer.isView(t));// 100 200 32 true// 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)// 举例来说,数值 0x2211 使用两个字节储存,高位字节是 0x22,低位字节是 0x11// 大端字节序:高位字节在前,低位字节在后,即以 0x2211 形式储存,这个符合人类的习惯,所以一般都是大端字节序// 小端字节序:低位字节在前,高位字节在后,即以 0x1122 形式储存// DataView 对象的 setXXX() 方法的第 3 个参数用于指定是否使用小端字节序,默认为 false(即使用大端字节序)// DataView 对象的 getXXX() 方法的第 2 个参数用于指定是否使用小端字节序,默认为 false(即使用大端字节序)
}

源码 https://github.com/webabcd/TypeScriptDemo
作者 webabcd

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IEEE 1838-2019协议翻译——第五章 Serial test access ports

目录 5.1 Primary test access port5.1.1 Specifications5.1.2 Description 5.2 Primary test access port controller5.2.1 Specifications5.2.2 Description5.3 Secondary test access port (STAP)5.3.1 Specifications5.3.2 Description 5.4 Secondary test access port con…

帝国cms登陆错误次数 帝国cms登陆错误次数超过

帝国CMS为了防止暴力破解攻击,默认设置了登录错误次数的限制。当登录错误次数超过设定值时,系统会暂时禁止登录一段时间。如果你遇到了登录错误次数超过限制的问题,可以采取以下几种方法来解决:等待重试默认情况下,帝国CMS会在你连续输入错误密码5次后锁定账户60分钟。这时…

win10远程控制教程,使用工具:ToDesk

win10远程控制教程,使用工具:ToDesk 最近用到远程控制软件的地方可太多了 不但能随时解决突发工作问题,还能和很多电子设备互连👍 用了一堆软件下来,发现还是ToDesk远程控制最趁手 今天小圈先来出个【win10电脑远程控制教程】💻 答应我,打工人都要来学会好吗!🔵实现…

独立站如何批量查收录,独立站怎么批量查询收录

独立站批量查收录是网站管理和SEO优化中的重要环节,它可以帮助网站管理员快速了解网站在各大搜索引擎中的收录情况。以下是一些常用的独立站批量查询收录的方法: 一、使用搜索引擎的site指令 这是最基本也是最直接的查询方式。具体操作步骤如下: 打开搜索引擎:如百度、谷歌…

手机被远程控制了怎么办,ToDesk远控来安全护航

随着远程办公的需求越来越大,经常会使用远程控制软件进行手机文件传输,远程办公以及远控父母手机帮助学习等等操作。 但也不免让人担心远程控制软件在手机内是否安全?一不小心被人恶意远控手机了,不仅个人信息泄露不说,银行卡支付宝也面临财产风险。最近小编找到了一款超好…

SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索

SimpleAISearch:C# + DuckDuckGo 实现简单的AI搜索最近AI搜索很火爆,有Perplexity、秘塔AI、MindSearch、Perplexica、memfree、khoj等等。 在使用大语言模型的过程中,或许你也遇到了这种局限,就是无法获取网上最新的信息,导致回答的内容不是基于最新的信息,为了解决这个…

关于codepage

codepage就是各国的文字编码和Unicode之间的映射表。系统使用映射表就可以在各种编码中做转换。 查表 以gbk为例,它的codepage=936, 可以从ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT下载映射表。 “中”字的映射为验证 https://www.toolhelper…

七牛云——存储区域说明

​​ 区域和访问域名存储区域 Region 区域 Region ID 域名华东-浙江 z0 空间管理:http(s)://uc.qiniuapi.com​源站上传:http(s)://up-z0.qiniup.com​源站下载:http(s)://iovip-z0.qiniuio.com​对象管理:http(s)://rs-z0.qiniuapi.com​对象列举:http(s)://rsf-z0.qiniu…

linux 下安装 RabbitMq 及 .net core 实操多种模式

当前系统Debian GNU/Linux 12 安装命令1、sudo apt update    //更新系统2、sudo apt-get install rabbitmq-server    //安装rabbitMq 服务3、sudo service rabbitmq-server start     //启动 rabbitMq4、sudo systemctl enable rabbitmq-server //设置开机…

易基因:组学研究:MeRIP-seq等揭示m6A甲基化及调控因子在食管胃结合部腺癌(AEG)中的作用和调控机制

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 食管胃结合部腺癌(adenocarcinoma of the esophagogastric junction,AEG)是一种在食管胃结合部发生的腺癌,其发病率在全球范围内呈上升趋势,但具体的发病机制尚不明确。尽管在基因组、转录组、蛋白质组和磷…

NPN 和 PMOS 管脚

NPN三极管:以SS8050为例: PMOS :以SI2333 为例:可以看到,控制极都在1脚位置。

云栖大会Day1:云应用开发平台 CAP 来了

2024 云栖大会开幕,在大会第一天,阿里云正式发布全新产品——云应用开发平台 CAP。CAP 拥有丰富的场景化应用模板,可以极速体验,并且具备更低的成本优势以及灵活组装等特点,成为广大开发者与企业必备的一站式应用开发平台,让应用开发更简单。2024 云栖大会开幕,在大会第…