Skip to main content

read_range

Function read_range 

Source
pub fn read_range<F>(
    header: &FixedHeader,
    payload_key: &SecretKey,
    index: Option<&[CompressionIndexEntry]>,
    offset: u64,
    length: u64,
    fetch_ct: F,
) -> Result<Vec<u8>>
where F: FnMut(u64, u64) -> 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