fixzt-0.3.0 is not a library.
ZIP文件偏移修复工具 (fixt)
一个用于修复ZIP文件偏移量问题的命令行工具,专门解决"图种"或其他在ZIP文件头部添加数据导致的ZIP结构损坏问题。
功能特点
- ✅ 支持普通ZIP格式(32位偏移)
- ✅ 支持ZIP64格式(64位偏移)
- ✅ 修复因头部附加数据导致的偏移量错误
- ✅ 自动识别ZIP格式类型
- ✅ 保持原始文件完整性
- ✅ 命令行界面,使用简单
解决的问题
当ZIP文件头部被添加额外数据时(如图种文件),会导致以下问题:
# 输出:
# warning [corrupted.zip]: 100 extra bytes at beginning or within zipfile
# (attempting to process anyway)
这些问题出现的原因是:
- ZIP文件内部记录的偏移量仍然基于原始ZIP结构
- 添加头部数据后,实际ZIP结构位置发生偏移
- 解压工具无法正确定位文件数据
工作原理
ZIP文件结构基础
ZIP文件由以下几部分组成:
- 本地文件头 - 存储每个文件的元数据和偏移信息
- 文件数据 - 实际的压缩文件内容
- 中央目录 - 所有文件的索引信息
- 中央目录结束记录(EOCD) - ZIP文件的尾部结构
修复逻辑
1. 定位ZIP尾部结构
- 在文件末尾64KB范围内搜索ZIP签名
- 优先查找ZIP64定位器签名(
0x07064b50) - 其次查找普通EOCD签名(
0x06054b50)
2. 计算偏移量
prefix_len = 实际中央目录位置 - 记录的中央目录偏移量
如果prefix_len > 0,说明存在前置数据需要修复。
3. 修复中央目录条目
- 遍历中央目录中的每个文件条目
- 修正32位本地头偏移量(位于条目+42字节处)
- 对于ZIP64格式,同时修正扩展字段中的64位偏移量
4. 修复结构偏移
- 普通ZIP:修正EOCD中的中央目录偏移(+16字节处)
- ZIP64:
- 修正ZIP64 EOCD中的中央目录偏移(+48字节处)
- 修正ZIP64定位器中的EOCD偏移(+8字节处)
使用方法
编译程序
运行修复
# 编译后直接运行
# 或使用cargo运行
使用示例
# 创建图种文件(示例)
# 修复文件
# 验证修复结果
技术细节
支持的ZIP格式
| 格式 | 特点 | 处理方式 |
|---|---|---|
| 普通ZIP | 32位偏移,最大4GB | 修正中央目录中的32位偏移字段 |
| ZIP64 | 64位偏移,支持超大文件 | 额外处理扩展字段中的64位偏移 |
ZIP签名常量
const EOCD_SIG: u32 = 0x06054b50; // 中央目录结束记录
const ZIP64_LOCATOR_SIG: u32 = 0x07064b50; // ZIP64定位器
const CENTRAL_DIR_SIG: u32 = 0x02014b50; // 中央目录条目
const ZIP64_EXT_TAG: u16 = 0x0001; // ZIP64扩展字段标签
错误处理
程序包含完善的错误处理机制:
- IO错误:文件读写问题
- EOCD未找到:无法识别的ZIP格式
- ZIP格式错误:文件结构损坏
安全性
- ✅ 原地修复,不创建临时文件
- ✅ 修正前验证ZIP结构完整性
- ✅ 防止越界访问,避免文件损坏
- ✅ 处理边界情况,确保数据安全
限制与注意事项
- 仅修复偏移量问题:无法修复其他类型的ZIP损坏
- 需要写权限:程序需要读写文件的权限
- 建议备份:对重要文件建议先备份再修复
开发信息
- 语言:Rust
- 依赖:thiserror(错误处理)
- 版本:0.1.0
- 兼容平台:支持Rust的所有平台
许可证
本项目采用开源许可证,具体请查看LICENSE文件。
贡献
欢迎提交Issue和Pull Request来改进这个工具。
注意:此工具主要用于修复因图种等技术导致的ZIP偏移问题,对于其他类型的ZIP文件损坏可能无效。