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 次下载
105KB
2K SLoC
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 不匹配的部分。