最近项目需要使用到 rust 去编写 WebAssembly ,并把 wasm 加载到 nodejs 中,这给不爱写 c++ 的我提供了另外一种方式去编写 wasm 文件。
从现在来看,rust 的一些文档好像还是不是很全面,示例也不是很多,并且由于是要用 WebAssembly 所以,很多 crate 也用不了,并且在各种类型转换中也遇到不少的问题,现在整理几个我在项目中常用的类型转换,主要是字符串操作和 js_sys 的一些类型转换,以备后续查询。
- String 和 &str 的转换
// String 转 &str
let s = String::from("hello");
let s_slice: &str = &s;
// &str 转 String
let s = "hello";
let s_string: String = s.to_string();
- String 和 Vec<u8> 的转换
// String 转 Vec<u8>
let s = String::from("hello");
let v: Vec<u8> = s.into_bytes();
// Vec<u8> 转 String
let v: Vec<u8> = vec![104, 101, 108, 108, 111]; // "hello"
let s: String = String::from_utf8_lossy(&v).to_string();
- Vec<u8> 和 &[u8] 的转换
// Vec<u8> 转 &[u8]
let v: Vec<u8> = vec![72, 101, 108, 108, 111]; // "Hello"
let v_slice: &[u8] = &v;
// &[u8] 转 Vec<u8>
let v_slice: &[u8] = &[72, 101, 108, 108, 111]; // "Hello"
let v_vec: Vec<u8> = v_slice.to_vec();
- &str 和 &[u8] 的转换
// &str 转 &[u8]
let s: &str = "hello";
let s_bytes: &[u8] = s.as_bytes();
// &[u8] 转 &str
let s_bytes: &[u8] = &[104, 101, 108, 108, 111]; // "hello"
let s_str: &str = std::str::from_utf8(s_bytes).unwrap();
- js_sys::JsValue 的一些转换
//从 JsValue 创建一个 Uint8Array
let result: JsValue = JsValue::from_str("this is string");
let arr:Uint8Array = js_sys::Uint8Array::new(&result);
//Uint8Array 转成 Vec<u8>
let u8_arr = js_sys::Uint8Array::new(&result).to_vec();
//&[u8] 生成 Uint8Array
let binary_array: Uint8Array = Uint8Array::from(content);
//Uint8Array 生成 JsValue
let js_val = JsValue::from(binary_array);
//从 &str 生成 JsValue
let js_value:JsValue = JsValue::from_str("this is a text");
//JsValue 生成 String
let js_str = js_value.as_string().unwrap();
如果你对这个行业充满兴趣,那么请关注我,我将为大家分享程序界的各种知识、八卦趣闻等,没有门槛,只要你有兴趣。