[英]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.