在 rust 中将 Vec<u8> 转换为 Vec<{float}>

Tut*_*u ツ 1 byte rust

我正在寻找通过渠道传递消息。消息类型bytes::Bytes取决于通道的实现。

我想要发送的消息是关于浮点数 ( Vec<{float}>) 的向量,我将其转换如下:

let flatten_array: Vec<u8> = correct_centroids
            .clone()
            .into_iter()
            .flat_map(|x| f32::to_le_bytes(x).to_vec().into_iter())
            .collect();

 let data = Bytes::from(flatten_array);
Run Code Online (Sandbox Code Playgroud)

我的问题是,我怎样才能重新转换Vec<u8>我回到的 状态Vec<{float}>

还有其他更好的方法来序列化消息吗?

caf*_*e25 5

您可以使用chunks拆分Vec(或更具体地说任何切片),转换为数组并调用from_le_bytes,即几乎只需执行与您所做的相反的操作:

fn u8_to_f32_vec(v: &[u8]) -> Vec<f32> {
    v.chunks_exact(4)
        .map(TryInto::try_into)
        .map(Result::unwrap)
        .map(f32::from_le_bytes)
        .collect()
}
Run Code Online (Sandbox Code Playgroud)

唯一的问题是chunks它只给出切片,而不给出数组引用。将来(或每晚)可以用该array_chunks方法编写:

#![feature(array_chunks)]
fn u8_to_f32_vec(v: &[u8]) -> Vec<f32> {
    v.array_chunks::<4>()
        .copied()
        .map(f32::from_le_bytes)
        .collect()
}
Run Code Online (Sandbox Code Playgroud)

操场

注意:两个版本都会在切片末尾默默地删除多余的字节。