我有一个带有BufStream<T>where 的结构T: Read+Write.该BufStream可以是一个TcpStream,我想从中读取n个字节.在预定义的缓冲区中不是固定数量的字节,但我有一个字符串/流,它指示下一个要读取的字节数.
有一个很好的方法吗?
自Rust 1.6以来,Read::read_exact可以用来做到这一点.If bytes_to_read是您需要读取的字节数,可能在运行时确定,并且reader是要读取的流:
let mut buf = vec![0u8; bytes_to_read];
reader.read_exact(&mut buf)?;
Run Code Online (Sandbox Code Playgroud)
read_exact文档中我不清楚的部分是目标缓冲区可以动态分配Vec.
感谢Rust Gitter社区指导我这个解决方案.
听起来像您想要的Read::take和Read::read_to_end:
use std::io::prelude::*;
use std::io::BufReader;
use std::str;
fn read_n<R>(reader: R, bytes_to_read: u64) -> Vec<u8>
where
R: Read,
{
let mut buf = vec![];
let mut chunk = reader.take(bytes_to_read);
// Do appropriate error handling for your situation
let n = chunk.read_to_end(&mut buf).expect("Didn't read enough");
assert_eq!(bytes_to_read as usize, n);
buf
}
fn main() {
let input_data = b"hello world";
let mut reader = BufReader::new(&input_data[..]);
let first = read_n(&mut reader, 5);
let _ = read_n(&mut reader, 1);
let second = read_n(&mut reader, 5);
println!(
"{:?}, {:?}",
str::from_utf8(&first),
str::from_utf8(&second)
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8097 次 |
| 最近记录: |