将 Vec<u8> 转换为 &[u16]

J V*_*J V 6 rust

Vec<u8>从文件中读取了一个字节 - 这些字节是文本格式(可能是 UTF-16 或其他一些愚蠢的 2 字节格式),我想将其转换为 UTF-8。

let title = Vec::from_iter(bytes.take(title_length));
// Some Vec<u8> to &[u16] magic
let title = String::from_utf16_lossy(title);
Run Code Online (Sandbox Code Playgroud)

目前我正在使用这个相当脏的代码:

let title: &[u16] = unsafe { std::slice::from_raw_parts(title_data.as_ptr(), title_data.len()) };
Run Code Online (Sandbox Code Playgroud)

虽然这应该有效,但我可能由于调用而收到错误take()

error: mismatched types:
 expected `*const u16`,
    found `*const core::result::Result<u8, std::io::error::Error>`
(expected u16,
    found enum `core::result::Result`) [E0308]
Run Code Online (Sandbox Code Playgroud)

我应该使用map迭代take器还是其他东西?

Ald*_*Lau 8

具有安全代码

以防万一您需要安全地进行操作,

let title = Vec::from_iter(bytes.take(title_length));
let title: Vec<u16> = title
    .chunks_exact(2)
    .into_iter()
    .map(|a| u16::from_ne_bytes([a[0], a[1]]))
    .collect();
let title = title.as_slice();
let title = String::from_utf16_lossy(title);
Run Code Online (Sandbox Code Playgroud)

请注意,这将分配内存,并进行额外的复制(不安全的替代方案不会这样做)。


llo*_*giq 0

有两个错误。首先,你需要.unwrap()你的Result(of from_raw_parts(..),我认为),其次长度太大,因为 au16占用了 a 空间的两倍u8,所以你需要除以 2。