我在一个页面中有一个可变宽度的数据块,我正在用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吗?
1条答案
按热度按时间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
)。如果你需要从中获得&str
或String
,还有其他方法。但是既然你提到它来自一个文件,那么我可能会跳过
ffi
,只做切片操作来找到nul包围的部分。