#[no_mangle] pub extern "C" fn decode(raw: *const libc::c_char) -> *mut u32 { let str_raw = unsafe { CStr::from_ptr(raw) }.to_str().unwrap().to_string(); let bytes_raw = hex::decode(str_raw).unwrap(); let mut u8_fixed: [u32; 6] = Decode::decode(&mut &bytes_raw[..]).unwrap(); let ptr = u8_fixed.as_mut_ptr(); std::mem::forget(u8_fixed); ptr }
nodejs code
let libm = ffi.Library(rootPath, { 'decode': [ref.refType("uint"), ['string']], } let value = libm.decode("010000000200000003000000040000000500000006000000")
decode 的 value 返回值应该是 []uint{1,2,3,4,5,6}
,现在打印出 value 看起来像是个 buffer, 不知道怎么解析这个 buffer
![]() | 1 nomagick 2022-08-07 22:01:01 +08:00 |
![]() | 3 nomagick 2022-08-08 11:33:00 +08:00 ![]() @freehere 你这个函数返回的是 ref(array(uint)), 第一层是个指针,你拿到的 buffer 是指针的值,把它 deref(), 才是 array(uint) |
![]() | 4 freehere OP @nomagick 试了一下,只返回了 第一个 value, test 在这里 https://github.com/gmajor-encrypt/scale-codec-comparator/blob/main/polkadot-js/test/base.spec.ts#L167 |
5 k1263 2022-08-26 16:59:26 +08:00 Decode::decode 哪里来的?自己定义的吗? |
7 k1263 2022-09-07 14:01:41 +08:00 @freehere 我的这一步会出错,CStr::from_ptr(raw).to_str(), 你的出错吗? #[no_mangle] pub extern "C" fn decode(raw: *const libc::c_char) -> *mut u32 { if raw.is_null() { return ptr::null_mut(); } if let Ok(str_raw) = unsafe { CStr::from_ptr(raw).to_str() } { println!("str_raw: {:?}", str_raw); let bytes_raw = hex::decode(str_raw).unwrap(); let mut u8_fixed: [u32; 6] = Decode::decode(&mut &bytes_raw[..]).unwrap(); let ptr = u8_fixed.as_mut_ptr(); std::mem::forget(u8_fixed); ptr } else { println!("str_raw fail"); return ptr::null_mut(); } } pub fn main() { let raw = "010000000200000003000000040000000500000006000000"; let aa = decode(raw.as_ptr() as *const i8); println!("{:?}", aa); } |
![]() | 8 zhangyuang 2024-01-07 17:58:39 +08:00 |