在 AssemblyScript 中连接或合并 TypedArrays

Posted

技术标签:

【中文标题】在 AssemblyScript 中连接或合并 TypedArrays【英文标题】:Concatenate or merge TypedArrays in AssemblyScript 【发布时间】:2020-04-03 19:43:19 【问题描述】:

我有两个长度为 32 字节的 Uint8Array,我想将它们合并为一个长度为 64 的 Uint8Array。

所以我的问题是:

有没有办法在 AssemblyScript 中将两个 TypedArray 合并成一个新的相同类型的 TypedArray。

我想我正在寻找与 javascript 中的 TypedArray.set() 方法等效的方法:

var c = new Uint8Array(Uint8Array_1.length + Uint8Array_2.length);
c.set(Uint8Array_1);
c.set(Uint8Array_2, Uint8Array_1.length);

欢迎任何提示!

【问题讨论】:

【参考方案1】:

更新

TypedArray.set 已经登陆 master 和 assemblyscript@nightly 所以你现在可以用通常的方式来做:

var c = new Uint8Array(a.length + b.length);
c.set(a);
c.set(b, a.length);

目前TypedArray.set 尚未实现,但您仍有变体:

版本 1(JavaScript 方式):

var a: Int8Array = ...
var b: Int8Array = ...
var alen = a.length;
var blen = b.length;
var c = new Int8Array(alen + blen);
for (let i = 0; i < alen; i++) 
  unchecked(c[i] = a[i]);

for (let i = 0; i < blen; i++) 
  unchecked(c[i + alen] = b[i]);

版本 2(AssemblyScript 方式):

var a: Int8Array = ...
var b: Int8Array = ...
var alen = a.length;
var blen = b.length;
var c = new Int8Array(alen + blen);
var aPtr = a.dataStart;
var bPtr = b.dataStart;
var cPtr = c.dataStart;
memory.copy(cPtr, aPtr, alen);
memory.copy(cPtr + alen, bPtr, blen);

【讨论】:

谢谢,第 2 版正是我想要的!

以上是关于在 AssemblyScript 中连接或合并 TypedArrays的主要内容,如果未能解决你的问题,请参考以下文章

使用 AssemblyScript 通过引用操作画布数据(类型化数组)

在 AssemblyScript 中实例化数组的三种不同方法

如何在 AssemblyScript 中使用 asc 编译 console.log("1")?

如何在 AssemblyScript / Near 中打印数组的长度?

WebAssembly学习:AssemblyScript - Hello World

三等号 (===) 在 AssemblyScript 中的行为是不是不同?