将 Vec<u8> 转换为 Rust 中的 Vec<{float}>

问题描述 投票:0回答:1

我希望通过渠道传递消息。由于通道的实现,消息类型为

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);

我的问题是,如何重新转换我返回的

Vec<u8>
再次
Vec<{float}>

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

rust byte
1个回答
0
投票

您可以使用

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

fn u8_to_f32_vec(v: &[u8]) -> Vec<f32> {
    v.chunks(4)
        .flat_map(TryInto::try_into) // `flat_map` only takes `Ok` values but we only get `Ok` values to begin with
        .copied()
        .map(f32::from_le_bytes)
        .collect()
}

唯一的问题是

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()
}
© www.soinside.com 2019 - 2024. All rights reserved.