Stream 如何检查std::io::Cursor是否有未使用的数据?
我正在编写一个底层网络应用程序,它处理TCP套接字,在这些套接字中我经常需要处理二进制数据流。当一些数据可用时,我将其读入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
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)
}