簡體   English   中英

WebAssembly:在JavaScript中從參數(帶內存地址)獲取字符串的正確方法

[英]WebAssembly: Correct way to get a string from a parameter (with memory address) in JavaScript

我試圖了解如何將C代碼轉換為WebAssembly和JavaScript interop在后台運行。 我在從函數參數中獲取簡單字符串時遇到問題。

我的程序是一個簡單的Hello World,我正試圖“模擬”一個printf / puts

或多或少我想要構建的C等價物:

int main() {
  puts("Hello World\n");
}

你可以在這里看到一個有效的例子。

我目前最好的想法是一次讀取16位內存塊(因為我們似乎以16位間隔分配它們)並檢查空終端。

function get_string(memory, addr) {
  var length = 0;

  while (true) {
    let buffer = new Uint8Array(memory.buffer, addr, 16);
    let term = buffer.indexOf(0);

    length += term == -1 ? 16 : term;

    if (term != -1) break;
  }

  const strBuf = new Uint8Array(memory.buffer, addr, length);
  return new TextDecoder().decode(strBuf);
}

但這看起來很笨拙。 如果您只知道起始地址,是否有更好的方法從內存中讀取字符串?

我是否真的有必要一次只讀16位塊? 如果創建一個類型的內存數組計數訪問整個內存,我找不到任何信息,或者只有當我嘗試從數組中獲取數據時才會發生這種情況。

WebAssembly以64k頁面分配內存。 也許這就是16位產品的來源,因為16位可以解決64 KB的問題。 然而,這與手頭的任務無關,因為WebAssembly內存只是一個連續的地址空間, memory對象和給定大小的ArrayBuffer之間沒有太大區別,如果有的話。

一次16字節窗口也不是必需的(不知何故16位變為16字節)。

您可以在沒有任何性能損失的情況下完成此操作,並以下列方式創建緩沖區其余部分的視圖:

function get_string(memory, addr) {
  let buffer = new Uint8Array(memory.buffer, addr, memory.buffer.byteLength - addr);
  let term = buffer.indexOf(0);

  return new TextDecoder().decode(buffer.subarray(0, term));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM