Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stream 如何检查std::io::Cursor是否有未使用的数据?_Stream_Rust - Fatal编程技术网

Stream 如何检查std::io::Cursor是否有未使用的数据?

Stream 如何检查std::io::Cursor是否有未使用的数据?,stream,rust,Stream,Rust,我正在编写一个底层网络应用程序,它处理TCP套接字,在这些套接字中我经常需要处理二进制数据流。当一些数据可用时,我将其读入u8数组,然后封装到std::io::Cursor中,然后将其传递给处理程序。在处理程序中,我经常需要知道光标中是否还有一些数据 假设handle函数接收数据,然后使用handle\u chunk函数分块处理数据。为简单起见,假设块大小固定为10字节;如果数据大小不能被10整除,则为错误。此简单逻辑可通过以下方式实现: fn handle(mut data: Cursor&l

我正在编写一个底层网络应用程序,它处理TCP套接字,在这些套接字中我经常需要处理二进制数据流。当一些数据可用时,我将其读入
u8
数组,然后封装到
std::io::Cursor
中,然后将其传递给处理程序。在处理程序中,我经常需要知道
光标中是否还有一些数据

假设
handle
函数接收数据,然后使用
handle\u chunk
函数分块处理数据。为简单起见,假设块大小固定为10字节;如果数据大小不能被10整除,则为错误。此简单逻辑可通过以下方式实现:

fn handle(mut data: Cursor<&[u8]>) {
    while !data.empty() {
        if let Err(err) = handle_chunk(&mut data) {
            eprintln!("Error while handling data: {}", err);
        }
    }
}

fn handle_chunk(data: &mut Cursor<&[u8]>) -> Result<(), String> {
    // Returns Err("unexpected EOF".to_string()) if chunk is incomplete
    // ...
}

不过,这看起来既粗俗又不雅观。有更好的解决办法吗?也许Rust标准库中有一种不同的工具比Cursor更适合这里?

您的代码可以通过使用来简化,以避免中断输入并将其重新组合在一起:

fn handle(mut data: Cursor<&[u8]>) {
    let len = data.get_ref().len();

    while (data.position() as usize) < len - 1 {
        if let Err(err) = handle_chunk(&mut data) {
            eprintln!("Error while handling data: {}", err);
        }
    }
}
通过使用
mut数据:&[u8]
并使用
和mut数据
,代码将更新slice变量以将其向前推进。不过,我们不能轻易倒退

empty()
方法

Rust样式表示
空的
方法将是动词-这将删除数据(如果可能的话)。您想要的方法应该被称为
是空的
,如切片上所示

fn handle(mut data: Cursor<&[u8]>) {
    let len = data.get_ref().len();

    while (data.position() as usize) < len - 1 {
        if let Err(err) = handle_chunk(&mut data) {
            eprintln!("Error while handling data: {}", err);
        }
    }
}
use std::io::Read;

fn handle(mut data: &[u8]) {
    while !data.is_empty() {
        if let Err(err) = handle_chunk(&mut data) {
            eprintln!("Error while handling data: {}", err);
        }
    }
}

fn handle_chunk<R: Read>(mut data: R) -> Result<(), String> {
    let mut b = [0; 10];
    data.read_exact(&mut b).unwrap();
    println!("Chunk: {:?}", b);
    Ok(())
}

fn main() {
    let d: Vec<u8> = (0..20).collect();
    handle(&d)
}