我在将指针和字符串的长度和长度保存在Struct中后,试图将WASM堆中的字符串另存为Uint8Array
,以便以后可以访问该字符串。以下是我在rust
中的代码>
#[wasm_bindgen] pub struct CustomString{ ptr : *const u8, len: usize } #[wasm_bindgen] impl CustomString{ pub fn create(len:usize) -> Self{ let mut d = Vec::with_capacity(len); log!("{}",len); CustomString{ ptr: d.as_ptr(), len } } pub fn as_ptr(&self) -> *const u8{ self.ptr } pub fn print_string(&self){ let js = unsafe { std::slice::from_raw_parts(self.ptr, self.len) }; let js = unsafe { std::str::from_utf8_unchecked(js) }; log!("{}",js) } }
我的JS辅助代码如下:
function myTest (){ debugger; const { memory } = wasm; let encoder = new TextEncoder(); let mystring = "Ujjal"; let encodedString = encoder.encode(mystring); let length = encodedString.length; console.log(length) let cs = CustomString.create(length); let ptr = cs.as_ptr(); const asBytes = new Uint8Array(memory.buffer, ptr, length); asBytes.set(encodedString); return cs; } let cs = myTest(); function decode(cs){ cs.print_string(); } decode(cs);
理想情况下,它应该打印给定的字符串,但显示一些不相关的垃圾值。无法弄清楚出了什么问题,因为我刚接触生锈和浪费。
我正在尝试在将字符串的指针和长度以及Struct中的长度保存并编码后,将WASM堆中的字符串保存为Uint8Array,以便以后可以访问该字符串。下面是我的代码在锈#...
在create
中,您正在创建vec d
并获取其指针,但是在函数结束后,vec d
被释放并且您的指针指向无效的内存。