我正在编写一个涉及TCP套接字的低级网络应用程序,通常需要处理二进制数据流。当有一些数据可用时,我将其读入
这看起来很不专业和不优雅。有更好的解决方案吗?也许Rust标准库中有一个不同的工具比
u8
数组中,然后包装到std::io::Cursor<&[u8]>
中,并将其传递给处理程序。在处理程序中,我经常需要知道Cursor
中是否还有更多数据。
假设handle
函数接收数据,然后使用handle_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
// ...
}
然而,Cursor
没有一个empty()
方法或其他可以告诉您是否有更多数据要处理的方法。我能想到的有效解决方案是:
fn handle(data: Cursor<&[u8]>) {
let data = data.into_inner();
let len = data.len();
let mut data = Cursor::new(data);
while (data.position() as usize) < len - 1 {
if let Err(err) = handle_chunk(&mut data) {
eprintln!("Error while handling data: {}", err);
}
}
}
这看起来很不专业和不优雅。有更好的解决方案吗?也许Rust标准库中有一个不同的工具比
Cursor
更适合这里?