pub fn read_range<F>(
header: &FixedHeader,
payload_key: &SecretKey,
index: Option<&[CompressionIndexEntry]>,
offset: u64,
length: u64,
fetch_ct: F,
) -> Result<Vec<u8>>Expand description
读取明文的任意区间,只解密必要的块。
这是视频 seek 的实现基础。
§fetch_ct 的偏移语义(极易用错,务必注意)
回调收到的第一个参数是相对载荷起点的偏移,不是文件绝对偏移。
载荷起点即 header.header_len。若数据源是整个文件,必须自行加回:
ⓘ
let header_len = u64::from(opened.header.header_len);
read_range(&opened.header, opened.payload_key(), None, off, len,
|payload_off, l| {
let abs = payload_off + header_len; // ← 这一步不能漏
Ok(file_bytes[abs as usize..(abs + l) as usize].to_vec())
})漏掉加回会取到偏移 header_len 的错误字节,AEAD 会以
Error::ChunkAuthFailed 拒绝——报错信息指向「数据损坏」,
容易误判成文件坏了或密钥不对,实际是偏移用错。
这样设计是为了让调用方自由选择数据来源:本地文件、内存、 局域网 HTTP Range 请求皆可,无需把整个文件载入内存。对只存载荷的 数据源(如分片、远程对象存储)而言,相对偏移正是它需要的形式。
§Errors
Error::ChunkOutOfRange:区间超出文件范围Error::ChunkAuthFailed:某块认证失败(也可能是偏移用错,见上)- 回调返回的错误会向上传播