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里,要怎么做才是对的?

9 回复

可以先把 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 方法(接收 TypedArrayArray),也可直接 a2.set(src),一步完成复制,不必手动循环。

回到顶部