gpt4 book ai didi

rust - 如何从 bytes::BytesMut 中查看大端值?

转载 作者:行者123 更新时间:2023-12-03 11:43:26 30 4
gpt4 key购买 nike

我正在将我的一些旧代码转换为 future 异步/等待风格并且遇到了问题。

我正在使用 tokio_util crate ,因为我正在处理带有 Encoder 的框架协议(protocol)和 Decoder这个箱子的特征。

对于Decoder ,我需要查看传递的 bytes::BytesMut 的前 2 个字节struct 因为这些字节保存了帧的长度。然而 BytesMut struct 不容易做到这一点。我的功能是:

impl Decoder for MyCodec {
type Item = ServerMessage;
type Error = io::Error;

fn decode(&mut self, buf: &mut BytesMut) -> io::Result<Option<ServerMessage>> {
if buf.len() <= 2 {
return Ok(None);
};

如果至少 2 个字节在 buf 中,则下一步将发生,并且应该以大端格式读取这些字节以继续解码。问题是我看不到如何使用 BytesMut结构体。

最佳答案

经过一些实验,我认为这可能是做到这一点的最佳方式。来自 standard library documentation它在“from_be_bytes”函数下显示“从切片而不是数组开始时,可​​以使用易出错的转换 API”。

use bytes::BytesMut;
use std::convert::TryInto;

impl Decoder for MyCodec {
type Item = ServerMessage;
type Error = io::Error;

fn decode(&mut self, buf: &mut BytesMut) -> io::Result<Option<ServerMessage>> {
if buf.len() <= 2 {
return Ok(None);
};

let frame_size = u16::from_be_bytes(buf[..2].try_into().unwrap());

...
}
}

关于rust - 如何从 bytes::BytesMut 中查看大端值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60103685/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com