尧图精选

uni-app x UTS 内建对象 DataView 完全指南:任意偏移读写二进制缓冲区的跨端方案

🕒 发布时间:2026/9/19 21:53:54 📁 来源:尧图网络
示例工程前端移动开发跨平台【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址https://gitcode.com/gh_mirrors/un/uni-app点击查看免费下载导读DataView 是 UTS 内建对象之一它允许你在不改动底层存储的前提下为同一个 ArrayBuffer 建立多种视图从而按字节偏移自由读写 8/16/32 位有符号、无符号整数与 32/64 位浮点数。本文以 docs/uts/buildin-object-api/dataview.md 为主体结合仓库中的真实测试用例 TDataView.uts 与语法示例 SyntaxCase/index.uvue完整讲解构造函数、实例属性、全部读写方法及 Web / Android / iOS / HarmonyOS 各端兼容性读完即可在 uni-app x 项目中直接完成二进制协议解析、文件头读取、大小端转换等实战任务。DataView 与 ArrayBuffer 的关系在 UTS 中ArrayBuffer 用于表示通用的原始二进制数据缓冲区它本身不暴露任何读写能力必须借助视图来操作。视图有两类类型化数组Int8Array、Uint8Array、Int16Array、Uint16Array、Int32Array、Uint32Array、Float32Array、Float64Array 等元素类型固定、按对齐规则访问适合同构数据批量处理。DataView提供无对齐约束的字节级读写多字节值可以从任意偏移处获取且读写时可显式指定大端/小端是解析异构二进制数据如网络协议包、文件格式、硬件上报数据的首选工具。DataView 的意义在于同一个 ArrayBuffer 上可以叠加任意多个 DataView每个视图通过 byteOffset / byteLength 只暴露自己关心的内存窗口互不干扰。构造函数new DataView(buffer, byteOffset?, byteLength?)使用 ArrayBuffer 实例以及可选的 byteOffset 和 byteLength 参数调用时会创建一个指向该缓冲区的新 DataView 视图new DataView(buffer, byteOffset?, byteLength?) : DataView参数说明| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | buffer | ArrayBufferLike { BYTES_PER_ELEMENT ?: never; } | 是 | ArrayBuffer 实例 | | byteOffset | number | 否 | 可选偏移量单位字节 | | byteLength | number | 否 | 长度 |边界语义byteOffset 与 byteLength 共同指定视图暴露的内存范围。若两者都省略视图覆盖整个 buffer若仅省略 byteLength则视图覆盖从 byteOffset 开始到 buffer 末尾的剩余部分。返回值DataView 实例对象。buffer 参数的类型约束与属性构造参数的类型为ArrayBufferLike { BYTES_PER_ELEMENT ?: never; }它有两个关键属性| 名称 | 类型 | 必备 | 兼容性 | 描述 | | :- | :- | :- | :-: | :- | | byteLength | number | 是 | Web: √; Android: 4.25; iOS: 4.11; HarmonyOS: 4.61 | ArrayBuffer 实例的 byteLength 访问器属性返回该数组缓冲区的长度以字节为单位 | | BYTES_PER_ELEMENT | never | 否 | - | 不允许出现在该类型上用于区分类型化数组的交叉类型约束 |buffer 上可用slice(begin?, end?)slice(begin ?: number, end ?: number) : ArrayBufferArrayBuffer 实例的 slice() 方法返回一个新的 ArrayBuffer 实例包含原缓冲区中从 begin包含到 end不含的所有字节的副本。参数| 名称 | 类型 | 必填 | 描述 | | :- | :- | :- | :- | | begin | number | 否 | 要开始提取的位置索引从 0 开始将被转换为整数。负数索引从缓冲区末尾反向计算若 start 0 则使用 start buffer.length若 start -buffer.length 或省略则使用 0若 start buffer.length则不提取任何内容 | | end | number | 否 | 要结束提取的位置索引从 0 开始不包含。负数索引从缓冲区末尾反向计算若 end 0 则使用 end buffer.length若 end -buffer.length 则使用 0若 end buffer.length 或省略则使用 buffer.length提取到末尾若标准化后的 end 在 start 之前则不提取任何内容 |返回值一个新的 ArrayBuffer 对象。slice 兼容性| Web | Android | iOS | HarmonyOS | | :- | :- | :- | :- | | √ | 4.25 | 4.11 | 4.61 |buffer 上可用toByteBuffer()toByteBuffer() : ByteBuffer返回一个 Android 原生java.nio.ByteBuffer对象用于在 UTS 插件中与 Android 原生 API 对接例如通过 utsandroid.md 中的类型转换直接操作 Java 侧字节流。返回值Android 原生 ByteBuffer 对象。toByteBuffer 兼容性仅 Android 4.25 支持Web / iOS / HarmonyOS 均不支持x。buffer 上可用toData()toData() : Data返回一个 iOS 原生Data对象用于与 Swift/Objective-C 原生 API 对接参见 utsios.md。返回值iOS 原生 Data 对象。toData 兼容性文档标注当前各端均为 x尚未全面开放使用时需以实际运行环境为准。构造函数兼容性uni-app x 兼容性| Web | Android | iOS | HarmonyOS | iOS(VDOM) UTS 插件 | | :- | :- | :- | :- | :- | | √ | 4.25 | 4.11 | 4.61 | 4.51 |uni-app 兼容性| Android UTS 插件 | iOS UTS 插件 | HarmonyOS UTS 插件 | | :- | :- | :- | | √ | 4.51 | √ |实例属性只读DataView 的实例属性在构造时被固定因此全部只读。| 属性 | 类型 | 说明 | | :- | :- | :- | | buffer | ArrayBuffer | 引用该视图的底层缓冲区 | | byteLength | number | 视图的长度以字节为单位 | | byteOffset | number | 视图开始位置相对于 ArrayBuffer 的字节偏移量 |兼容性buffer / byteLength / byteOffset 三个属性在 uni-app x 端一致支持Web √、Android 4.25、iOS 4.11、HarmonyOS 4.61、iOS(VDOM) UTS 插件 4.51uni-app 插件端 Android 与 HarmonyOS UTS 插件支持、iOS UTS 插件 4.51 支持。从仓库测试 TDataView.uts 可以看到 byteLength 在循环遍历中的典型用法以固定步长扫描整个缓冲区时用view.byteLength作为上界var view new DataView(buffer); for (var i 0; i view.byteLength; i 14) { xor ^ view.getInt8(i); xor ^ view.getUint8(i 1); xor ^ view.getInt16(i 2, littleEndian); xor ^ view.getUint16(i 4, littleEndian); xor ^ view.getInt32(i 6, littleEndian); xor ^ view.getUint32(i 10, littleEndian); }实例方法总览DataView 共提供 16 个读写方法全部遵循无对齐约束、可从任意偏移读写多字节值的原则| 类别 | 读取 | 写入 | | :- | :- | :- | | 有符号 8/16/32 位 | getInt8 / getInt16 / getInt32 | setInt8 / setInt16 / setInt32 | | 无符号 8/16/32 位 | getUint8 / getUint16 / getUint32 | setUint8 / setUint16 / setUint32 | | 浮点 32/64 位 | getFloat32 / getFloat64 | setFloat32 / setFloat64 |关于 littleEndian 参数仅多字节方法16/32 位整数与 32/64 位浮点接受该参数单字节方法Int8 / Uint8不受字节序影响因此不提供该参数。当 littleEndian 为 false 或未定义时按大端网络字节序读写为 true 时按小端读写。在 Android / iOS / HarmonyOS 原生运行环境中默认采用大端语义需要解析网络协议或读取二进制文件时应显式传入正确的字节序。读取方法详解所有 get 方法的通用参数为 byteOffsetnumber必填表示从视图开始检索值的位置返回值均为 number。getInt8(byteOffset) / getUint8(byteOffset)获取指定字节偏移处的 Int8 / Uint8 值。单字节读写不受字节序影响无需 littleEndian 参数。// Create an ArrayBuffer with a size in bytes let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setInt8(1, 127); // Max signed 8-bit integer let ret view.getInt8(1) console.log(ret)//127getInt16(byteOffset, littleEndian?) / getUint16(byteOffset, littleEndian?)let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setInt16(1, 32767); // Max signed 16-bit integer let ret view.getInt16(1); console.log(ret); // 32767getInt32(byteOffset, littleEndian?) / getUint32(byteOffset, littleEndian?)let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setInt32(1, 2147483647); // Max signed 32-bit integer let ret view.getInt32(1); console.log(ret); // 2147483647getFloat32(byteOffset, littleEndian?)let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setFloat32(1, 3); let ret view.getFloat32(1); console.log(ret); // 3getFloat64(byteOffset, littleEndian?)let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setFloat64(1, Math.PI); let ret view.getFloat64(1); console.log(ret); // 3.141592653589793写入方法详解所有 set 方法的通用参数为 byteOffsetnumber必填设置值的位置与 valuenumber必填要设置的值多字节方法额外提供 littleEndianboolean可选false 或未定义时写入大端值。全部写入方法无返回值void。setInt8(byteOffset, value) / setUint8(byteOffset, value)let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setUint8(1, 255); // Max unsigned 8-bit integer let ret view.getUint8(1); console.log(ret); // 255setInt16 / setUint16 / setInt32 / setUint32 / setFloat32 / setFloat6416/32 位方法与浮点方法签名一致均为(byteOffset, value, littleEndian?)let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setUint32(1, 4294967295); // Max unsigned 32-bit integer let ret view.getUint32(1); console.log(ret); // 4294967295大小端字节序实操与源码级验证DataView 的核心优势之一是在同一缓冲区上混用不同字节序读取。仓库测试 TDataView.uts 提供了完整的双向验证逻辑doTestDataViewBigEndian()/doTestDataViewLittleEndian()分别以大小端模式构造 1000 组数据并回读校验makeBuffer(size, littleEndian)以 14 字节为步长交错写入 Int8/Uint8/Int16/Uint16/Int32/Uint32 六种类型其中i * 14 6等偏移展示了非对齐读写能力doOneIterationDV用xor累加校验所有读回值必须与写入值完全一致expect(xor).toEqual(0)。该测试还内置了手写的BigEndian/LittleEndian工具类基于 Uint8Array 手工移位拼装用于与 DataView 的结果交叉比对可作为理解字节序的参考实现。示例中通过expect断言验证setConstructor等场景如new DataView(buffer, 1, 4)配合setInt16(1, 42)后读回 42确认 byteOffset/byteLength 窗口切片的正确性。在 SyntaxCase/index.uvue 中还可见 DataView 与其他 UTS 二进制能力组合使用的模式new DataView(buffer)、new DataView(ret.b, 0, 16)等写法后者展示了从某个结果对象中取出字节数组ret.b再从偏移 0 起截取 16 字节创建视图的典型用法可用于解析固定长度的协议头。实战解析固定长度协议头综合以上 API一个典型的多字段二进制协议头解析代码如下可直接在 UTS 运行环境中执行// 模拟收到 16 字节协议头version(u8) type(u8) length(u16) seq(u32) timestamp(f64) let buffer new ArrayBuffer(16); let view new DataView(buffer); view.setUint8(0, 1); // version 1 view.setUint8(1, 2); // type 2 view.setUint16(2, 1024, true); // length 1024小端 view.setUint32(4, 99, true); // seq 99小端 view.setFloat64(8, Date.now(), true); // timestamp小端 // 读取时同样按小端解析 let version view.getUint8(0); let type view.getUint8(1); let length view.getUint16(2, true); let seq view.getUint32(4, true); let timestamp view.getFloat64(8, true); console.log(version, type, length, seq, timestamp);要点总结统一字节序写入与读取必须传入相同的 littleEndian 值否则数值会被字节反转越界防护byteOffset 类型字节数不能超过视图的 byteLength否则行为未定义建议在解析前先校验剩余长度非对齐安全多字节值可以从任意奇数偏移读取无需手动对齐这正是 DataView 相比类型化数组的独特价值窗口切片通过new DataView(buffer, offset, length)可以只暴露缓冲区局部防止误写其他区域。兼容性速查所有 16 个读写方法与 3 个实例属性uni-app x| Web | Android | iOS | HarmonyOS | iOS(VDOM) UTS 插件 | | :- | :- | :- | :- | :- | | √ | 4.25 | 4.11 | 4.61 | 4.51 |uni-appUTS 插件体系| Android UTS 插件 | iOS UTS 插件 | HarmonyOS UTS 插件 | | :- | :- | :- | | √ | 4.51 | √ |特殊方法差异化兼容| 方法 | Web | Android | iOS | HarmonyOS | | :- | :- | :- | :- | :- | | slice | √ | 4.25 | 4.11 | 4.61 | | toByteBuffer | x | 4.25 | x | x | | toData | x | x | x | x |需要留意的是DataView 本体在 Android 上自 4.25 起支持iOS 自 4.11 起支持HarmonyOS 自 4.61 起支持跨端 UTS 插件场景下 iOS 需 4.51。若项目需要同时覆盖更早版本可参考 TDataView.uts 中手工实现的 BigEndian/LittleEndian 工具类思路基于 Uint8Array 自行封装读写逻辑作为降级方案。延伸阅读ArrayBuffer 内建对象文档DataView 的底层缓冲区类型包含构造函数、静态方法与 slice 等能力类型化数组族Int8Array / Uint8Array / Int16Array / Uint16Array / Int32Array / Uint32Array / Float32Array / Float64Array适合同构数据的批量视图示例工程hello-uts 语法示例 中 DataView 与二进制 API 的组合用法单元测试TDataView.uts覆盖构造函数、全部 get/set 方法、大小端与浮点精度的完整测试集合平台原生对接utsandroid.mdtoByteBuffer 相关与 utsios.mdtoData 相关赞分享示例工程前端移动开发跨平台【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址https://gitcode.com/gh_mirrors/un/uni-app点击查看免费下载相关推荐uni-app UTS 内置对象 ArrayBuffer 完全指南跨端二进制数据处理与内存共享实战uni app UTS 内置对象 ArrayBuffer 完全指南跨端二进制数据处理与内存共享实战 ArrayBuffer 是 uni app 的 UTSU示例工程前端移动开发跨平台uni-app x UTS 内置对象 Set 完全指南去重、增删查改与跨端实践uni app x UTS 内置对象 Set 完全指南去重、增删查改与跨端实践 Set 对象是值的集合元素按插入顺序迭代且天然唯一是 UTS 中做去重、成示例工程前端移动开发跨平台UTS 内置对象 Console 完全指南uni-app / uni-app x 跨端日志、断言、计时与分组调试实践UTS 内置对象 Console 完全指南uni app / uni app x 跨端日志、断言、计时与分组调试实践 Console 是 UTS 语言内置的全示例工程前端移动开发跨平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →