HarmonyOS鸿蒙Next中如何将一个ArrayBuffer复制到一个collections.Uint8Array
HarmonyOS鸿蒙Next中如何将一个ArrayBuffer复制到一个collections.Uint8Array 例如有以下两个变量:
let a1 = new ArrayBuffer( 10 );
//此处省略a1被赋值的代码。
let a2 = new collections.Uint8Array( 5 );
我现在要把a1的前5个数值复制到a2里,要怎么做才是对的?
可以先把 ArrayBuffer 建一个只读视图,再用 collections.Uint8Array.set 写入目标数组。注意你的 a1 是 10 字节,而 a2 只有 5 个元素,要明确拷贝长度,避免越界。
示例:
import { collections } from '@kit.ArkTS';
let a1 = new ArrayBuffer(10);
let a2 = new collections.Uint8Array(5);
const copyLen = Math.min(5, a2.length, a1.byteLength);
const src = new Uint8Array(a1, 0, copyLen);
a2.set(Array.from(src), 0);
如果源也是 collections.ArrayBuffer,且 buffer 长度满足 collections.Uint8Array 构造要求,也可以用 new collections.Uint8Array(buffer, 0, copyLen) 构造源视图后 set。严格 ArkTS 场景下如果 set 对原生 Uint8Array 类型提示不兼容,转成 Array.from(src) 或用 for 循环逐项赋值最稳。
更多关于HarmonyOS鸿蒙Next中如何将一个ArrayBuffer复制到一个collections.Uint8Array的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
我没用Array.from(src),直接写的a2.set(src, 0);也可以。
先把 a1 包装成一个可按字节访问的视图,再逐个写入 a2。因为 ArrayBuffer 只是原始缓冲区,不能直接按下标取值。
示例代码:
import { collections } from '@kit.ArkTS'
let a1 = new ArrayBuffer(10)
// 这里省略 a1 被写入数据的过程
let a2 = new collections.Uint8Array(5)
// 先给 a1 建一个标准 Uint8Array 视图,读取前 5 个字节
let src = new Uint8Array(a1, 0, 5)
for (let i = 0; i < 5; i++) {
a2[i] = src[i]
}
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html,
对,这样写也可以,而且在类型检查能通过的情况下更直接。官方 collections.Uint8Array.set(array: ArrayLike<number>, offset?: number) 接收的是 ArrayLike<number>,标准 Uint8Array 也有 length 和索引访问,所以 a2.set(src, 0) 可以直接把前面视图里的数据写进去。
我前面写 Array.from(src) 主要是为了遇到 ArkTS 类型推断、collections.Uint8Array 和标准 TypedArray 混用时报类型不兼容时做兜底;实际项目里能编译通过,就优先用 a2.set(src, 0) 这版。
另外建议保留 copyLen = Math.min(…) 这类边界限制,避免以后源 buffer 或目标数组长度变化时越界。
参考:
let a1 = new ArrayBuffer(10);
// ... a1 被赋值 ...
let a2 = new collections.Uint8Array(5);
// 正确方法:创建ArrayBuffer的视图,然后使用set方法
let view = new Uint8Array(a1);
a2.set(view.subarray(0, 5));
在鸿蒙Next的ArkTS中,可直接通过构造方法转换:
let uint8 = new collections.Uint8Array(arrayBuffer);
或使用set方法复制数据:
uint8.set(new Uint8Array(arrayBuffer));
以上方式均将ArrayBuffer内容复制到collections.Uint8Array实例中。
在HarmonyOS Next中,可使用标准 Uint8Array 视图从 ArrayBuffer 读取数据,再写入 collections.Uint8Array(一般使用其 setAt 方法)即可完成复制:
let src = new Uint8Array(a1, 0, 5); // 创建只读前5字节的视图
for (let i = 0; i < 5; i++) {
a2.setAt(i, src[i]); // 逐元素写入collections.Uint8Array
}
如果所用 collections.Uint8Array 版本支持 set 方法(接收 TypedArray 或 Array),也可直接 a2.set(src),一步完成复制,不必手动循环。


