我用rust来调用c++,有bindgen
和cc
生成的 struct . struct 字段类型类似于[i8;11]
或[i8;n]
.我想要设置这些字段.
如何编写一个通用函数将RUST String/CStr/CString
转换为i8
/c_char
数组?
我用rust来调用c++,有bindgen
和cc
生成的 struct . struct 字段类型类似于[i8;11]
或[i8;n]
.我想要设置这些字段.
如何编写一个通用函数将RUST String/CStr/CString
转换为i8
/c_char
数组?
您必须了解两个问题:
encoding_rs
这样的外部库来正确转换编码.让我们假设C/C++字符串也是用UTF-8编码的(同样,这也是您可以在Windows上not做的假设).然后,您可以(例如)将其转换为:
use std::ffi::CString;
fn main() {
// Fill with dummy data to 'simulate' the situation of uninitialized memory
let mut c_array = [42i8; 11];
// The data that should get written into c_array
let rust_string = String::from("Hello!");
// Convert to CString, required for FFI
let rust_cstring = CString::new(rust_string).unwrap();
// Extract null-terminated raw data
let byteslice = rust_cstring.as_bytes_with_nul();
// Write data. Note that this will panic if `byteslice` is longer than `c_array`.
let mut byteslice_iter_i8 = byteslice.iter().map(|v| *v as i8);
c_array[0..byteslice.len()].fill_with(|| byteslice_iter_i8.next().unwrap());
println!("{:?}", c_array);
}
[72, 101, 108, 108, 111, 33, 0, 42, 42, 42, 42]
当然,还有其他方法,这一种方法可能不是实现这一点的唯一最佳方法,但我希望它能够演示基本原则.