我有一个需要实现的FFI签名:
pub unsafe extern fn f(header_size: u32, header_ptr: *mut u8) -> i32;
一个FFI调用者需要提供一个缓冲区
header_ptr
和该缓冲区的大小header_size
。Rust需要将一个字符串填充到该缓冲区中,直到达到header_size
的大小,并在成功时返回0
。FFI调用者需要将该字符串解释为ASCII。如果我有一个包含要提供内容的
headers:&str
,最符合惯用法的方式是什么?目前我的做法是:
let header_bytes = slice::from_raw_parts_mut(header_ptr, header_size as usize);
if header_bytes.len() < headers.len() { return Errors::IndexOutOfBounds as i32; }
for (i, byte) in headers.as_bytes().iter().enumerate() {
header_bytes[i] = *byte;
}
但这感觉不对。
编辑,我认为这不是这个问题的完全重复,因为我的问题涉及字符串,而我记得在将&str转换为CStrings时有特殊考虑。