Uint8Array byteoffset 和 unsigned char*

Uint8Array byteoffset and unsigned char*

在这个函数中(https://github.com/migerh/wasm-filter/blob/master/filter.js):

function filter(imageData) {
    const bufferPointerIn = 1024,
        {data, width, height} = imageData,
        bufferIn = new Uint8Array(wasmModule.memory.buffer, bufferPointerIn, width * height * 4),
        bufferPointerOut = 2048 + width * height * 4,
        bufferOut = new Uint8Array(wasmModule.memory.buffer, bufferPointerOut, width * height * 4);

    bufferIn.set(data);
    wasmModule.outline_c(bufferPointerIn, bufferPointerOut, width, height);
    data.set(bufferOut);
    return data;
}

bufferPointerInbufferPointerOut根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array

基本上是byteoffset

如何作为指针使用?我的意思是如何将 javascript 中的整数理解为 C 中的 unsigned char*。提前谢谢你。

wasmModule.memory.buffer 是代表 WASM 模块内存的缓冲区。也就是说,从 C 程序的角度来看,地址 X 处的值将是 wasmModule.memory.buffer.

的索引 X 处的值。

因此任何对 wasmModule.memory.buffer 有效的索引(即 0(包括)和 wasmModule.memory.buffer.byteLength(不包括)之间的任何整数)将是 C 程序的有效内存地址。

由于您使用 bufferPointerInbufferPointerOut 作为传递给 C 函数的指针以及 Uint8Array 的偏移量,这意味着这些数组中的内容将对应于这些地址处的内存内容(从 C 程序的角度来看)。