gpt4 book ai didi

rust - Read::read 是否保证附加数据而不覆盖任何现有数据?

转载 作者:行者123 更新时间:2023-11-29 08:03:17 31 4
gpt4 key购买 nike

我正在开发一个 SMTP 库,它使用缓冲读取器通过网络读取行。

我想要一种安全的方式来从网络读取数据,而不依赖于 Rust 内部机制来确保代码按预期工作。具体来说,我想知道 Read trait 是否保证使用 Read::read 读取数据附加到作为参数传递的缓冲区,而不是完全覆盖缓冲区。

此刻,I use a Range确保现有数据不会在不依赖 Rust 内部结构的情况下被覆盖。

但是,考虑到 Rust used to have一个做我想做的好方法,我想知道是否可以改进当前代码,也可能删除 unsafe block 。

最佳答案

不,它不保证:

use std::io::prelude::*;
use std::str;

fn main() {
let mut source1 = "hello, world!".as_bytes();
let mut source2 = "moo".as_bytes();

let mut dest = [0; 128];
source1.read(&mut dest).unwrap();
source2.read(&mut dest).unwrap();

let s = str::from_utf8(&dest[..16]).unwrap();

println!("{:?}", s)
}

这打印

"moolo, world!\u{0}\u{0}\u{0}"

具体来说,它不能做你想做的,纯粹基于类型签名:

fn read(&mut self, buf: &mut [u8]) -> Result<usize>;

read 方法所能访问的只是您的可变切片——没有地方可以存储诸如“您在缓冲区中的距离”之类的信息。此外,您不能用更多元素“扩展”可变切片 - 您只能改变切片内的值。

对于您的特定情况,您可能需要查看 BufRead::read_until .这是一个几乎没有经过测试的示例:

use std::io::{BufRead,BufReader};
use std::str;

fn main() {
let source1 = "header 1\r\nheader 2\r\n".as_bytes();
let mut reader = BufReader::new(source1);

let mut buf = vec![];
buf.reserve(128); // Maybe more efficient?

loop {
match reader.read_until(b'\n', &mut buf) {
Ok(0) => break,
Ok(_) => {},
Err(_) => panic!("Handle errors"),
}

if buf.len() < 2 { continue }

if buf[buf.len() - 2] == b'\r' {
{
let s = str::from_utf8(&buf).unwrap();
println!("Got a header {:?}", s);
}
buf.clear();
}
}
}

关于rust - Read::read 是否保证附加数据而不覆盖任何现有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30338705/

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