我想通过一个渠道传递一条消息.由于通道的实现,消息类型为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}>.

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

推荐答案

您可以使用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()
}

唯一的问题是,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()
}

Playground

注意:这两个版本都会在切片末尾静默丢弃多余的字节.

Rust相关问答推荐

在rust中如何修改一个盒装函数并将其赋回?

如何从接收&;self的方法克隆RC

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

关于如何初始化弱 struct 字段的语法问题

默认特征实现中的生命周期问题

如何删除Mac Tauri上的停靠图标?

为什么这个变量不需要是可变的?

AXUM一路由多个不包括URL的参数类型

在Rust 中移动原始指针的靶子安全吗

不能在Rust中使用OpenGL绘制三角形

Rust将String上的迭代器转换为&;[&;str]

使用 select 处理 SIGINT 和子等待!无阻塞

我可以解构self 参数吗?

在描述棋盘时如何最好地使用特征与枚举

为什么我们有两种方法来包含 serde_derive?

将原始可变指针传递给 C FFI 后出现意外值

Rust 引用元组和引用元组

具有生命周期和以后引用的可变方法

在 Rust 中退出进程

Rust 生命周期:不能在方法内重新borrow 可变字段