How to read a specific number of bytes from a stream?

后端 未结 2 1994
梦谈多话
梦谈多话 2020-12-06 05:24

I have a struct with a BufStream where T: Read+Write. The BufStream can be a TcpStream and I\'d like to read n b

相关标签:
2条回答
  • 2020-12-06 05:29

    Since Rust 1.6, Read::read_exact can be used to do this. If bytes_to_read is the number of bytes you need to read, possibly determined at runtime, and reader is the stream to read from:

    let mut buf = vec![0u8; bytes_to_read];
    reader.read_exact(&mut buf)?;
    

    The part that wasn't clear to me from the read_exact documentation was that the target buffer can be a dynamically-allocated Vec.

    Thanks to the Rust Gitter community for pointing me to this solution.

    0 讨论(0)
  • 2020-12-06 05:32

    It sounds like you want Read::take and Read::read_to_end:

    use std::{
        io::{prelude::*, BufReader},
        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
        // Maybe it's OK if you didn't read enough bytes?
        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)
        );
    }
    
    0 讨论(0)
提交回复
热议问题