rust 如何使用FFI从一堆C字符串中读取数据?

qfe3c7zg  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(124)

我在一个页面中有一个可变宽度的数据块,我正在用Rust处理。
这个块表示一个空终止的C字符串堆。我在这个堆中有一个偏移量,它表示起始字符,读应该发生在遇到空之前。

let heap = *b"foobar\0baz\0quuz\0"; // Assume [u8;16] or Vec<u8>
let offset = 0;
let myCstring = something(heap, offset);
assert!( myCstring, "foobar\0" );

字符串
查看ffi::CString , I don't see anything that address the needs of something(heap, starting_char_index) above的文档。
因为这是用另一种语言编写的二进制文件格式的一部分,这些是C字符串,我应该尝试用ffi来做这件事吗?我应该只是滚动我自己的东西,忽略ffi吗?

pu82cl6c

pu82cl6c1#

你可以使用std::ffi::CStr来获取nul终止的内存区域。如果你在Rust区,那么CStr::from_bytes_until_nul(&heap[offset..])是合适的,但是如果你来自C-land,你只有一个指针和偏移量,那么CStr::from_ptr是合适的(用heap.add(offset))。
这将给你一个给予&CStr,它类似于&str,只是有一个null终止符,而且可能不是UTF-8。如果你需要声明该字符串的所有权,你可以使用.to_owned()来获得CString(分别类似于String)。如果你需要从中获得&strString,还有其他方法。
但是既然你提到它来自一个文件,那么我可能会跳过ffi,只做切片操作来找到nul包围的部分。

相关问题