我正在寻找通过渠道传递消息。消息类型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}>。
还有其他更好的方法来序列化消息吗?
您可以使用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)
注意:两个版本都会在切片末尾默默地删除多余的字节。