如何将无符号整数切片转换为相同大小的有符号整数?

ben*_*nji 3 casting slice rust

我目前最好的努力是

// `value` is a `&[u8]`
let v = unsafe { slice::from_raw_parts(value.as_ptr() as *const i8, value.len()) };
Run Code Online (Sandbox Code Playgroud)

需要这个似乎有点过分了unsafe。我希望这是零成本。

E_n*_*ate 5

您的代码已经是零成本了。但它必须在底层使用不安全的代码,因为编译器通过slice::from_partsor完成时并不能保证所有类型的切片转换都是安全的mem::transmute。无论哪种“安全”函数适合此处,都可能会包含该函数,同时确保项目类型与此转换兼容(即相同的大小和内存对齐)。

您可能会找到多个可以对此转换进行适当测试和维护的板条箱。该板条箱safe-transmute实现了这种转换,同时支持更多的绑定防护和对齐检查(免责声明:我是合作者之一)。

use safe_transmute::transmute_many_pedantic;

let value: &[u8] = &[0x00, 0x01, 0x12, 0x24, 0x00];
let words: &[i8] = transmute_many_pedantic(values)?;
Run Code Online (Sandbox Code Playgroud)