开天辟地 HarmonyOS(鸿蒙) - ArkTS 进阶: ArrayBuffer

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

开天辟地 HarmonyOS(鸿蒙) - ArkTS 进阶: ArrayBuffer

示例如下:

pages\arkts\advanced\ArrayBuffer.ets

import { TitleBar, MyLog } from '../../TitleBar';@Entry
@Component
struct ArrayBufferDemo {build() {Column() {TitleBar()Text("代码示例结合 HiLog 日志一起看")}}
}{/*** 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() - 判断指定的对象是否是视图MyLog.d(`${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;MyLog.d(`${a[0]}, ${a[1]}, ${a[2]}, ${a.length}, ${a.BYTES_PER_ELEMENT}, ${a.buffer.byteLength}, ${ArrayBuffer.isView(a)}`);// 100, 200, 3, 3, 4, 12, true// 各种 TypedArray 类型的元素占用的字节大小MyLog.d(`${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]);MyLog.d(`${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);MyLog.d(`${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);MyLog.d(`${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);MyLog.d(`${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/HarmonyDemo
作者 webabcd

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

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

相关文章

电脑本地部署deepseek教程

Ollama:本地大模型运行指南奇舞精选2024-04-2814,445阅读11分钟关注 智能总结 复制 重新生成 这篇文章主要介绍了本地大模型运行框架 Ollama。包括其简介、安装方法(下载安装及大模型下载)、终端对话(如显示帮助、模型信息等命令)、API 调用(generate 和 chat 两…

可能是对春节假期的一些总结

写在前面2603 字 | 总结 | 经历 | 思考 | 感触未经允许,禁止转载。 正文「我一直都应该知道,听到别人说出她的名字,我还是会心里一跳。」过年与我当初预计的完全不同。我当初的计划,春节七八天,写很多很多文章,极速推进今年年度计划的写作一项。为此还专门订阅了一个月的…

搜狗录音笔c1折腾

1.买的pdd厂家帮我整好了大部分(应该刷过固件) 2.遇到的问题就是c to c的线...它没有协商,得插电脑usb-a口上才能识别到 3.厂家提供的搜狗录音笔助手这个软件是有点小处理的不是原软件(指解锁登录,其他的没看出问题,至少软件没报毒)

task3

任务二:Smiling-Weeping-zhr/Travel-assistant 自建项目链接,有关大模型关于大模型解答旅游相关

1.4 条件分支和循环机制

程序的流程分为顺序执行、条件分支和循环三种 顺序执行是按照地址内容的顺序执行指令。 条件分支是根据条件执行任意地址的指令。 循环是指重复执行同一地址的指令。 顺序执行每执行一个指令程序计数器的值自动加1条件分支和循环中使用的跳转指令,会参照当前执行的运算结果来判…

vue3使用flv.js播放flv直播流

目前有个需求是:管理直播机有一个列表需要查看每个直播机的实时内容,所以需要在后台加这个功能。 效果:我用ffmpeg模拟推流: 如何用ffmpeg模拟推流请看我上一篇文章 网页: 如上是可以正确再网页端拉流,这个功能费了一天的时间,在这里免费分享出来。 首先安装flv.js(用n…

DeepSeep本地部署

1、浏览器搜索引擎更改 2、搜索:Ollama操作下载: 也可直接进入下载路径:https://ollama.com/download/windows ollama run deepseek-r1 本文来自博客园,作者:他还在坚持嘛,转载请注明原文链接:他还在坚持嘛 https://www.cnblogs.com/brf-test/p/18699050

Linux下使用df与du命令查看磁盘空间

1、df磁盘空间查看df可以查看一级文件夹大小、使用比例、档案系统及其挂入点。[root@oms ~]# df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/vda1 ext4 40G 35G 3.1G 92% / devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev tmp…

JOKER智能可视化平台 20250204版本更新说明

本次 JOKER 低代码平台更新涵盖了代码生成、环境变量、可视化开发工具等多个关键领域的优化与新增功能,致力于为开发者提供更高效、更安全、更便捷的开发体验。同时,服务端功能的正式发布以及核心升级,进一步增强了平台的整体性能和竞争力。 一、功能更新与优化 (一)代码生…

城市智慧升级:超算与智算的协同效应

随着数字化转型的不断深入,城市高质量发展越来越依赖于强大的算力支持。结合超级计算(超算)和智能计算(智算)的“超算+智算”模式,正在成为推动城市创新和智能化发展的重要力量。超算与智算的结合超级计算通常指的是使用最先进的计算机硬件和软件进行大规模科学计算的技术…

linux安装适用glibc2.17的nodejs高版本

从nodejs18开始需要的glibc版本要>2.28,这对有些系统是不支持的,除了官方的下载地址外,还有个地址可以下载适用2.17的nodejs高版本。 https://unofficial-builds.nodejs.org/download/release/ 对于linux平台直接下载解压使用即可。本帖子也是纯手工制作,转载请标明出处…