Rufus压缩解压:多种压缩格式支持
概述
Rufus作为一款功能强大的USB启动盘制作工具,其内置的BLED(Base Library for Easy Decompression)压缩解压库提供了对多种主流压缩格式的全面支持。这个功能使得Rufus能够直接处理压缩的镜像文件,无需用户预先解压,大大简化了启动盘制作流程。
支持的压缩格式
Rufus通过BLED库支持以下9种主流压缩格式:
| 压缩格式 | 文件扩展名 | 枚举值 | 特点 |
|---|---|---|---|
| ZIP | .zip | BLED_COMPRESSION_ZIP |
最常见的归档格式,支持多文件打包 |
| LZW | .Z | BLED_COMPRESSION_LZW |
Unix系统传统压缩格式 |
| GZIP | .gz | BLED_COMPRESSION_GZIP |
GNU压缩格式,常用于Linux系统 |
| LZMA | .lzma | BLED_COMPRESSION_LZMA |
7-Zip核心算法,高压缩比 |
| BZIP2 | .bz2 | BLED_COMPRESSION_BZIP2 |
Burrows-Wheeler算法,适合文本压缩 |
| XZ | .xz | BLED_COMPRESSION_XZ |
LZMA2算法,Linux发行版常用 |
| 7ZIP | .7z | BLED_COMPRESSION_7ZIP |
7-Zip归档格式(目前不支持) |
| VTSI | .vtsi | BLED_COMPRESSION_VTSI |
特定压缩格式 |
| ZSTD | .zst | BLED_COMPRESSION_ZSTD |
Facebook开发的现代压缩算法 |
技术架构
BLED库核心结构
BLED库采用模块化设计,每个压缩格式都有对应的解压器函数:
typedef long long int(*unpacker_t)(transformer_state_t *xstate);
unpacker_t unpacker[BLED_COMPRESSION_MAX] = {
unpack_none, // BLED_COMPRESSION_NONE
unpack_zip_stream, // BLED_COMPRESSION_ZIP
unpack_Z_stream, // BLED_COMPRESSION_LZW
unpack_gz_stream, // BLED_COMPRESSION_GZIP
unpack_lzma_stream, // BLED_COMPRESSION_LZMA
unpack_bz2_stream, // BLED_COMPRESSION_BZIP2
unpack_xz_stream, // BLED_COMPRESSION_XZ
unpack_none, // BLED_COMPRESSION_7ZIP (暂不支持)
unpack_vtsi_stream, // BLED_COMPRESSION_VTSI
unpack_zstd_stream, // BLED_COMPRESSION_ZSTD
};
解压流程
Rufus的解压处理遵循标准化的流程:
flowchart TD
A[选择压缩镜像文件] --> B[检测压缩格式类型]
B --> C{格式支持检查}
C -->|不支持| D[报错并退出]
C -->|支持| E[初始化BLED库]
E --> F[创建解压器状态结构]
F --> G[打开源文件和目标文件]
G --> H[调用对应解压器函数]
H --> I[实时解压数据]
I --> J[写入目标设备]
J --> K[完成解压]
核心API功能
BLED库提供了多种解压接口以满足不同场景需求:
1. 文件到文件解压
int64_t bled_uncompress(const char* src, const char* dst, int type);
将压缩文件src解压到目标文件dst,适用于标准文件操作。
2. Windows句柄解压
int64_t bled_uncompress_with_handles(HANDLE hSrc, HANDLE hDst, int type);
使用Windows文件句柄进行解压,提供更好的系统集成。
3. 文件到内存解压
int64_t bled_uncompress_to_buffer(const char* src, char* buf, size_t size, int type);
将压缩文件直接解压到内存缓冲区,适合小文件快速处理。
4. 压缩包目录提取
int64_t bled_uncompress_to_dir(const char* src, const char* dir, int type);
从压缩包中提取所有文件到指定目录(目前仅支持ZIP格式)。
5. 内存到内存解压
int64_t bled_uncompress_from_buffer_to_buffer(
const char* src, const size_t src_len,
char* dst, size_t dst_len, int type);
在内存中直接进行压缩数据解压,无需文件I/O操作。
性能优化特性
缓冲区管理
BLED库使用256KB的缓冲区大小,这是经过优化的默认值:
// ZSTD最小缓冲区要求:128KB + 3字节
// 因此设置缓冲区为256KB
uint32_t BB_BUFSIZE = 0x40000; // 256KB
错误处理机制
采用setjmp/longjmp实现统一的错误处理:
if (setjmp(bb_error_jmp))
goto err; // 跳转到错误处理
进度回调支持
支持进度回调函数,便于GUI界面显示解压进度:
typedef void (*progress_t)(const uint64_t read_bytes);
实际应用场景
场景1:直接使用压缩镜像制作启动盘
用户无需手动解压ISO镜像,Rufus自动检测并处理:
.iso.gz- 压缩的Linux发行版镜像.img.xz- 压缩的磁盘镜像文件.zip- 包含多个文件的归档镜像
场景2:网络下载压缩镜像处理
Rufus支持从网络下载的压缩镜像直接写入USB设备,减少中间步骤。
场景3:内存受限环境解压
对于资源受限的环境,可以使用内存到内存解压API,避免磁盘I/O开销。
使用示例
基本文件解压
// 初始化BLED库
bled_init(0, NULL, NULL, NULL, NULL, NULL, NULL);
// 解压.gz文件到目标文件
int64_t result = bled_uncompress("linux.iso.gz", "linux.iso", BLED_COMPRESSION_GZIP);
// 清理资源
bled_exit();
带进度显示的解压
void progress_callback(const uint64_t read_bytes) {
printf("已解压: %llu 字节\n", read_bytes);
}
bled_init(0, printf, NULL, NULL, progress_callback, NULL, NULL);
bled_uncompress("image.img.xz", "image.img", BLED_COMPRESSION_XZ);
技术优势
- 格式兼容性广:支持9种主流压缩格式,覆盖绝大多数使用场景
- 性能优化:256KB缓冲区大小平衡了内存使用和解压速度
- 错误恢复:统一的错误处理机制确保操作稳定性
- 进度反馈:支持实时进度回调,提升用户体验
- 内存友好:提供内存到内存解压接口,减少磁盘I/O
注意事项
- 7ZIP格式限制:目前
.7z格式尚未实现解压支持 - 缓冲区要求:自定义缓冲区大小必须是2的幂次方且不小于256KB
- 线程安全:BLED库不是线程安全的,需要在单线程环境中使用
- 资源清理:使用后必须调用
bled_exit()释放资源
总结
Rufus的压缩解压功能通过BLED库实现了对多种压缩格式的全面支持,为用户提供了便捷的一站式启动盘制作体验。无论是常见的ZIP、GZIP格式,还是专业的LZMA、XZ格式,Rufus都能高效处理,大大简化了用户的操作流程。
其模块化的设计和丰富的API接口使得压缩解压功能既强大又灵活,既能满足基本的文件解压需求,也能支持高级的内存操作和进度监控,体现了Rufus作为专业工具的技术深度和用户体验关怀。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00