7-Zip ZS 中的 Brotli 无损压缩:算法原理、构建安装与实战使用指南
桌面应用CLI【免费下载链接】7-Zip-zstd7-Zip with support for Brotli, Fast-LZMA2, Lizard, LZ4, LZ5 and Zstandard项目地址https://gitcode.com/gh_mirrors/7z/7-Zip-zstd点击查看免费下载导读本文以 Brotli 官方文档位于 C/brotli/README.md为核心系统讲解这一通用无损压缩算法的原理、格式特性与安装构建方式并结合本仓库7-Zip ZS即 7-Zip Zstandard Edition中 Brotli 的源码集成、多线程实现与命令行用法帮助读者在 7-Zip 环境中直接上手使用 Brotli.br压缩与解压。读完本文你将掌握 Brotli 的核心机制、编译安装方法、以及在 7-Zip ZS 中通过-m0brotli等参数完成压缩任务的完整实战方案。Brotli 算法是什么Brotli 是一种通用目的的无损压缩算法。它通过以下三种技术的组合来实现高压缩比现代变体的 LZ77 算法基于滑动窗口的重复内容匹配Huffman 编码对匹配长度、距离与字面量进行熵编码二阶上下文建模利用上下文信息进一步优化码流这也是 Brotli 对比传统 deflate 类算法在压缩密度上的关键差异。Brotli 的压缩比与当前最好的通用压缩方法相当速度上与 deflate 接近但能产出更致密的压缩数据similar in speed with deflate but offers more dense compression。这正是它在 HTTP 内容传输、Web 资源预压缩等场景中被广泛使用的原因。Brotli 压缩数据格式的规范由RFC 7932定义The Brotli Compressed Data Format。Brotli 以MIT 许可证开源发布许可证文件见 C/brotli/LICENSE。在本仓库中Brotli 的版本为1.2.0见仓库根 README.md 的 Codec overview 与版本信息一节作为 7-Zip 的附加编解码器随 7-Zip ZS 一起分发。关键特性Brotli 是流格式不是自包含归档格式原文档特别强调了一个容易忽略的技术要点brotli 是一个流stream格式它不包含诸如校验和checksums或未压缩数据长度之类的元信息。因此直接修改压缩流的原始raw数据区间解码器并不会察觉。这意味着 Brotli 本身不具备数据完整性校验能力解压端无法依靠格式自身发现数据被篡改若数据完整性与可靠性是硬性要求需要在 Brotli 之外另行设计例如封装到 7z 容器中或叠加哈希校验。这一特性在本仓库的 CPP/7zip/Archive/BrotliHandler.cpp 中也有体现.br归档的GetProperty仅提供kpidPackSize压缩大小与kpidSize解压大小解压结果的正确性依赖解码器返回码而非内嵌校验。安装与获取 Brotli通过系统包管理器安装在多数 Linux 发行版中安装brotli命令行工具只需使用包管理机制。Debian 系发行版apt install brotli在 macOS 上可以使用 Homebrewbrew install brotli此外主流发行版的软件仓库普遍收录了 brotli 包原文档以 repology 的打包状态图佐证其跨发行版覆盖度也可以随时从源码自行构建。通过依赖管理器安装vcpkg克隆 vcpkg 仓库后执行以下命令即可安装 brotli 端口该端口由微软团队成员与社区贡献者维护git clone https://github.com/Microsoft/vcpkg.git cd vcpkg ./bootstrap-vcpkg.sh ./vcpkg integrate install ./vcpkg install brotliBazelBrotli 上游提供了 Bazel 构建支持可直接在 Bazel 工作区中引用其目标。Python安装最新发布版 Python 模块pip install brotli若需安装开发分支tip-of-the-tree版本pip install --upgrade githttps://github.com/google/brotli通过 CMake 从源码构建上游官方给出的基础构建命令如下mkdir out cd out cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX./installed .. cmake --build . --config Release --target install-DCMAKE_BUILD_TYPERelease指定优化构建-DCMAKE_INSTALL_PREFIX./installed将安装目录固定到当前目录下的installed子目录避免污染系统路径也可以按需调整其他 CMake 配置项。本仓库中的 Brotli源码布局与适配本仓库将 Brotli 1.2.0 的完整源码内嵌于 C/brotli 目录并做了适配性改造源码目录结构保留了上游的common/、dec/、enc/三层布局对应通用工具、解码器、编码器公共头文件如decode.h、encode.h、shared_dictionary.h、types.h、port.h平铺在 C/brotli 根目录所有.c源文件以br_前缀重命名如br_encode.c、br_decode.c、br_huffman.c、br_metablock.c避免与仓库内其他算法模块的符号冲突Brotli-Adjust.sh 脚本记录了完整的适配流程调整include路径、重命名源文件、改写brotli/xxx.h为本地相对引用并在port.h中追加 MSVC 警告抑制项——这是把上游库搬进7-Zip 构建体系的关键步骤编码器/解码器的公共接口定义在 encode.h 与 decode.h其中窗口位宽等核心常量见下文参数一节直接决定了压缩窗口大小与内存占用。这种源码内嵌 前缀重命名 脚本适配的组织方式使得 Brotli 可以与 Zstandard、LZ4、LZ5、Lizard、Fast-LZMA2 等算法共存于同一 7-Zip 二进制互不干扰。7-Zip ZS 中的 Brotli 集成架构归档处理器BrotliHandler7-Zip ZS 通过 CPP/7zip/Archive/BrotliHandler.cpp 将 Brotli 注册为独立归档格式格式名为brotli扩展名br、brotli、tbr。其底层调用链清晰可循格式注册文件末尾的REGISTER_ARC_R(brotli, br brotli tbr, ...)将 Brotli 注册进归档系统并声明kKeepName保留原文件名等行为标志类型识别IsArc_BrotliBrotliHandler.cpp由于原始 Brotli 流RFC 7932没有文件签名识别采用多级策略——匹配 rarely-used 的 Brotli 头签名0xCE 0xB2 0xCF 0x81匹配 RFC 9841 封帧framedBrotli 的签名0x91 0x19 0x62 0x66直接调用BrotliDecoderDecompressStream()尝试解压前 256 字节若解码器未报错则判定为 raw Brotli 流。 这一试解压策略保证了绝大多数实际使用中不带签名的 raw 格式.br文件也能被正确识别。解压流程Extract方法内部创建NCompress::NBROTLI::CDecoder通过CodeResume循环推进解码并汇报进度当输入流不再产生新字节且解压字节数不为 0 时判定为归档正常结束压缩流程UpdateArchive创建NCompress::NBROTLI::CEncoder将待压缩文件流式送入编码器写出.br文件。编解码器实现BrotliEncoder / BrotliDecoderCPP/7zip/Compress/BrotliEncoder.cpp 与 CPP/7zip/Compress/BrotliDecoder.cpp 是 7-Zip 侧的编解码适配层原作者 Tino Reichardt两者都通过BROTLIMT_*系列 API定义于 C/zstdmt/brotli-mt.h完成实际的压缩/解压工作编解码通过回调函数BrotliRead/BrotliWrite桥接 7-Zip 的流接口与 brotli-mt 的BROTLIMT_RdWr_t读写抽象实现流式处理与进度上报线程数默认取 CPU 逻辑处理器数量并截断至库允许的上限BROTLIMT_THREAD_MAX128见 C/zstdmt/brotli-mt.h。多线程 Brotliskippable frame 容器单线程 Brotli 是纯流式格式难以直接并行。本仓库通过 C/zstdmt/brotli-mt_compress.c 与 C/zstdmt/brotli-mt_decompress.c 实现了多线程 Brotlimt-brotli将输入数据切分为多个独立压缩帧每帧以与 Zstandard 相同的skippable frame魔数0x184D2A50包裹帧头内嵌 12 字节元数据标识BRBROTLIMT_MAGICNUMBER 0x5242见 C/zstdmt/brotli-mt.h。普通解压器遇到 skippable frame 会跳过因此这种多帧流仍可被标准 Brotli 解压器读取按帧依次处理。在 BrotliHandler.cpp 中可以看到明确的格式策略注释7z 容器内的 Brotli始终使用 mt-brotli多线程容器形式独立的.br文件默认单线程 raw BrotliSetNumberOfThreads(0)注释明确.br - single threaded processing (without header/mt-frames)解压时若用户未显式通过-mmt指定线程数解码器会自动探测流内是否含 mt 容器魔数并据此选择解压路径用户显式指定-mmt则强制覆盖自动探测。在 7-Zip ZS 中使用 Brotli命令行实战仓库根 README.md 给出了 7-Zip ZS 命令行使用 Brotli 的完整方式。基础压缩命令7z a archiv.7z -m0brotli -mxN-m0brotli将第一个主压缩方法指定为 Brotli-mxN压缩级别Brotli 支持 Level 0 到 11BROTLIMT_LEVEL_MIN 0/BROTLIMT_LEVEL_MAX 11见 C/zstdmt/brotli-mt.h。-mx0为最快模式压缩比最低-mx11为最高压缩比模式。在完整安装GUI Explorer 集成版本中Brotli 既可用于.7z容器也可直接生成/解压独立的.br文件详见 README.md 的 Usage 一节。对于只使用 Codec 插件plugin的方式则只能创建.7z文件。直接压缩为 .br 文件7z a test.txt.br -m0brotli test.txt解压与测试7z x test.txt.br # 解压 7z t test.txt.br # 测试归档完整性验证 Brotli 已正确安装7z i输出中应出现如下条目说明 Brotli 编解码器已注册到当前 7-Zip 实例0 ED 4F71102 BROTLI控制压缩级别级别-mx说明-mx0最快模式压缩比最低-mx1…-mx10速度与压缩比逐步向高压缩比倾斜-mx11最高压缩比模式BROTLIMT_LEVEL_MAX级别参数在 BrotliEncoder.cpp 的SetCoderProperties中处理任何大于 11 的取值都会被钳位到BROTLIMT_LEVEL_MAX。控制线程数-mmtBrotli 编解码器支持多线程处理见上文 mt-brotli 机制7z a archiv.7z -m0brotli -mmt8-mmt8显式指定 8 个压缩线程未指定时默认使用全部逻辑处理器上限 128 线程解压时-mmt可以强制指定解压模式/线程数不指定时解码器自动探测流类型raw-st 或 framed-mt。控制窗口大小long / WindowLog窗口大小是 Brotli 压缩比与内存占用的关键权衡参数。在 BrotliEncoder.cpp 中实现了两个相关属性m0brotli:long等效于 zstd CLI 的--long选项将窗口设为BROTLI_MAX_WINDOW_BITS24m0brotli:longN指定窗口位宽 N小于 10 会被提升到BROTLI_MIN_WINDOW_BITS大于 30 会被钳位到BROTLI_LARGE_MAX_WINDOW_BITSm0brotli:windowN独立设置窗口位宽取值范围钳位在 10BROTLI_MIN_WINDOW_BITS到 24BROTLI_MAX_WINDOW_BITS之间常量定义见 C/brotli/encode.h。例如使用最大 2^24 16 MiB 窗口24 位以追求高压缩比7z a archiv.7z -m0brotli -mx11 -m0brotli:long回归测试与格式兼容性验证仓库的测试套件对 Brotli 覆盖细致。在 tests/regression.test 中可以看到专门针对 brotli-st单线程 raw Brotli与 brotli-mt多线程容器 Brotli的回归用例regression--test-brotli-st解压历史版本压缩的test.txt.brraw 单线程格式regression--test-brotli-mt解压test.txt.br-mt.br多线程容器格式并验证-mmt1、-mmtd100、-mmtp1d1等线程参数组合regression--test-brotli-st-with-mt/regression--test-brotli-mt-with-st交叉验证 st 流用 mt 解码或反之时的行为边界regression--test-brotli-mt-within-7z验证 7z 容器内的 Brotli 始终为 mt 形式无论指定多少线程都能正确解压。对应测试数据文件test.txt.br、test.txt.br-mt.br、test.txt.br.7z、test-sol.br.7z等位于 tests/regr-arc 目录。这些用例从侧面印证了前文的格式策略raw.br默认单线程7z 容器内则使用多线程容器两者在解压路径上按流内容自动区分。此外tests/main.test 在格式断言中检查brotlibr brotli tbr是否被 7-Zip 识别并将其与 zstd、bzip2、xz、gzip、lz4、lz5、lizard 等算法一同纳入 round-trip 压缩解压测试循环。生态与相关实现Brotli 生态中还存在若干独立实现原文档 Related projects 一节列出且声明 Brotli 作者对这些第三方项目不承担责任由 Mark Adler 基于格式规范RFC 7932独立编写的解码器实现完全不依赖上游源码Brotli 解码器的 JavaScript 移植可通过npm install brotli直接在 JS 项目中使用手写的 Haxe 移植可输出 JavaScript、PHP、Python、Java 与 C# 源码7-Zip 插件——即本仓库 7-Zip ZS 项目本身将 Brotli 与 Zstandard、LZ4、LZ5、Lizard、Fast-LZMA2 一并带入 7-Zip 生态Dart 压缩框架中的 Brotli 实现基于 FFI 绑定随附 Win/Linux/Mac 预编译二进制。本仓库正是官方文档中点名的 7-Zip 集成项目Brotli 源码内嵌于 C/brotli多线程封装位于 C/zstdmt归档/编解码适配层在 CPP/7zip/Archive/BrotliHandler.cpp 与 CPP/7zip/Compress 下测试与回归验证集中在 tests 目录——读者可以沿这条链路深入研读。使用建议与注意事项综合原文档说明与仓库实现给出如下实践要点.br是流格式无校验与长度信息单独存放.br文件时建议在应用层自行维护完整性校验如 SHA-256需要内嵌校验与多文件归档能力时优先选择 7z 容器 -m0brotli的组合。级别与窗口是主要调优旋钮Web/文本类数据追求压缩比可用-mx11配合long大窗口追求速度用-mx0。窗口越大压缩侧内存与耗时越高解压侧开销也随之上升。多线程按需开启单个大文件的压缩可用-mmtN加速小文件或流式场景下默认单线程.br即可避免多帧容器带来的少量开销。跨实现兼容由于本仓库采用与 Zstandard 一致的 skippable frame 约定承载多线程容器普通 Brotli 解码器也可按帧读取这类流但跨实现使用时仍建议以官方 raw 格式单线程.br为准确保最大兼容面。以上内容均以 C/brotli/README.md 为骨架结合本仓库 README.md、C/zstdmt/brotli-mt.h、CPP/7zip/Archive/BrotliHandler.cpp、CPP/7zip/Compress/BrotliEncoder.cpp 与 tests/regression.test 等源码与测试证据展开读者可按需深入对应文件核对细节。赞分享桌面应用CLI【免费下载链接】7-Zip-zstd7-Zip with support for Brotli, Fast-LZMA2, Lizard, LZ4, LZ5 and Zstandard项目地址https://gitcode.com/gh_mirrors/7z/7-Zip-zstd点击查看免费下载相关推荐Windows用户态文件系统深度解析WinFsp架构设计与高性能实现Windows用户态文件系统深度解析WinFsp架构设计与高性能实现 WinFspWindows File System Proxy是Windows平台上存储驱动开发7-Zip ZS六大压缩算法的技术革命与实战应用7 Zip ZS六大压缩算法的技术革命与实战应用 在数据存储与传输需求日益增长的今天7 Zip ZS作为一款革命性的压缩工具通过集成Zstandard、B桌面应用CLILongCat-Flash-Lite-Sparse在代码理解任务中的突破LongCodeQA基准测试62.3分背后的技术解析LongCat Flash Lite Sparse在代码理解任务中的突破LongCodeQA基准测试62.3分背后的技术解析 LongCat Flash Li人工智能大模型基础模型上一篇Knative开发者工具kn CLI和插件的完整使用指南下一篇WeTTY SSH连接终极指南从密码认证到密钥配置的完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →