4 个版本

0.0.4 2024年8月22日
0.0.3 2024年7月7日
0.0.2 2024年6月30日
0.0.1 2024年6月27日

#137压缩

每月 35 次下载

Apache-2.0 OR MIT

105KB
2K SLoC

Crates.io docs.rs pipeline status coverage report license dependencies

zip-core

根据 PKWARE-APPNOT 版本:6.3.10 提供的 zip 解析辅助库。此库旨在实现独立,提供无_std 基本功能,为 zip crate 提供结构/枚举。默认使用 std,但可以通过 default-features = false 禁用。

zip

[local file header 1]
[encryption header 1]
[file data 1]
[data descriptor 1]
.
.
.
[local file header n]
[encryption header n]
[file data n]
[data descriptor n]
[archive decryption header]
[archive extra data record]
[central directory header 1]
.
.
.
[central directory header n]
[zip64 end of central directory record]
[zip64 end of central directory locator]
[end of central directory record]

使用方法

您可以使用此 crate 来生成自己的 zip 解析器。无论是您是很好的 zip crate 的所有者,还是您想构建自己的异步版本,或者您想构建自己的 zip 解析器,例如在不出现任何错误的情况下尽可能多地提取损坏文件的数据。

此 crate 的本质是 io 无,我们不提供加载文件、流或任何其他内容的任何功能。除非启用 parse 功能,否则只提供 bytes::Buf

您可以使用此 crate 并在其周围提供自己的 io 逻辑,例如

let file = include_bytes!("example.zip");
let mut i = 0;
while let Some(local_occurence) = find_next_signature(
    &file[i..],
    core_zip::raw::CentralDirectoryHeaderFixed::CENTRAL_FILE_HEADER_SIGNATURE.to_le_bytes(),
) {
    let occurence = i + local_occurence;
    let mut buf = &file[occurence..];
    if let Ok(f) = CentralDirectoryHeaderFixed::from_buf(&mut buf) {
        println!("{:?}", std::str::from_utf8(&f.file_name));
    }
    i = occurence + 3;
}

您可能会看到 std::str::from_utf8,没错,这个 crate 甚至不会解释记录中的数据(除了某些大小值)。

它提供了一些实用工具,例如 is_valid_signature 来检查您解析的签名是否正确,但它不会阻止您对 zip 做出奇怪的操作。

您也可以使用此 crate 来构建自己的 zipbombs,可能性无限。

如果您想知道:这个 crate 的需求来自 veloren 项目,我们想在不上传整个 zip 的同时上传我们的游戏,因此我们只想下载 crc 不匹配的部分。

请参阅文档示例,以获取有关如何使用此 crate 的更多信息。

依赖项