如何将Vec<u8>包装为实现BufRead+Seek的读取器?
用标准库实现支持读取器
BufRead + Seek的Vec要解决unmarshal函数的约束问题,核心是找到同时实现BufRead和Seek的读取器包装方式。问题根源在于&[u8]未实现Seek,直接套BufReader无法满足要求,标准库的Cursor<Vec<u8>>可以完美解决这个问题:
具体实现代码
use std::io::{BufReader, Cursor}; use sdp::SessionDescription; // 假设你的SDP数据已存储在body中 let body: Vec<u8> = ...; // 用Cursor包装Vec<u8>,获得支持Seek的读取器 let cursor = Cursor::new(body); // 再用BufReader包装Cursor,同时满足BufRead和Seek约束 let mut reader = BufReader::new(cursor); // 正常调用unmarshal函数 let session_desc = SessionDescription::unmarshal(&mut reader)?;
原理说明
Cursor<Vec<u8>>:标准库提供的类型,将Vec<u8>转换为带位置指针的读取器,天然实现Read和Seektrait,支持移动读取位置、重置位置等操作。BufReader<Cursor<Vec<u8>>>:BufReader会为底层读取器添加缓冲功能,自动实现BufReadtrait;同时因为底层Cursor实现了Seek,整个包装后的读取器也满足Seek约束,完全匹配unmarshal的参数要求。
内容的提问来源于stack exchange,提问作者ddenuvo
相关产品推荐
相关产品推荐

