Gzip / Deflate
用 CompressionStream 压文本或文件,给出压缩率与解压还原校验。
这一页用浏览器原生的 Web Compression Streams API(CompressionStream / DecompressionStream)做压缩与解压还原,支持的格式完全取决于该 API:gzip、deflate(带 zlib 封装)、deflate-raw(裸 deflate)三种,页面在打开时用能力探测逐个试构造,可用的按钮照常、不可用的直接置灰并在悬停说明里写“本浏览器的 CompressionStream 没有实现这个格式”,绝不悄悄产出空结果。文本输入按 UTF-8 编码后再压(输入框旁实时显示编码后的字节数),也可以拖入或选择本地文件;解压模式的重点是把外壳看穿,压缩时每次都会立刻用同一格式回解并比对声明字节是否与原输入完全一致。产物给四类读数:体积数字、可回贴的 Base64(便于纯文本往返,解码端容忍空格与换行、并统计非法字符数)、前若干字节的 hex 头视图,以及可下载的 .gz/.zz/.bin 文件。
规范里 CompressionStream 没有 brotli,所以本页不声称、也不能压 brotli——需要 brotli 请交给命令行或服务器。无论哪种输入,字节都只在浏览器内存里流动,不上传、不发网络请求,这是整站的核心承诺。这一页没有“运行”按钮,改文本、换格式或换方向都会在 150 毫秒内自动重算。Web API 不暴露压缩级别开关,Chrome/所用引擎的 level 是实现定义的,这里显示的数字只代表当前浏览器,别的工具或版本的 gzip 字节可能不同。
Gzip / Deflate怎么用
- 先选方向与格式:顶部两组按钮:“方向”切压缩或解压还原,“压缩格式”在 gzip / deflate / deflate-raw 之间选。能力探测没过的格式按钮直接置灰并带悬停说明,提示条会写出本机可用与不可用的清单(原生 API 没有 brotli)。选完不用点任何“运行”:改动 150 毫秒内自动重算。
- 两种输入方式:同一个面板里上面是文本框、下面是一条拖放区。压缩模式贴文本即可(按 UTF-8 计字节);解压模式贴 Base64,也能把 .gz/.zz 文件拖进那条或点它选文件——一旦有了文件,就以文件字节为准并在结果里写明“输入来源”,此时文本框暂不参与计算,清空文件即回到文本。页面会自动探测 gzip / zlib / 裸 deflate 三种外壳。输入超过 8 MiB 时不自动算:横幅给出实际字节数并出现“仍然处理 N”按钮,确认后才跑;超过 32 MiB 是硬上限,直接拒绝并建议改用命令行——压缩与解压都在当前标签页的主线程上,宁可不给结果也不把页面卡死。
- 读结果:压缩结果自上而下是:体积统计卡(原始 / 压缩后 / 压缩率 / 省下百分比)、输入来源、比输入更大时的说明与往返校验结论,再往下收进三段可折叠区——Base64(可回贴到解压模式做文本往返)、前 32 字节 hex、体积账目与格式差异。解压结果同理,先是封装探测与还原字节/CRC32/ISIZE,再展开 gzip 或 zlib 的头字段与还原出的文本。折叠只影响显示,不参与判断。需要留存点“下载结果”,它会改成具体文件名;纯文本请自行选中复制——本页没有复制按钮。
- 解压时逐字段看什么:gzip 会逐字段解出 1f 8b 魔数、CM(应为 8=deflate)、FLG 标志位、4 字节 MTIME、XFL、OS,并按 FEXTRA/FNAME/FCOMMENT/FHCRC 的顺序吃掉可选字段,再对末尾 8 字节做真正的 CRC32 与 ISIZE 校验——不是忽略而是自算比对,篡改一位就会报“不一致”。
- zlib 头与裸 deflate 的差别:zlib 头读 CMF/FLG,用 (CMF<<8|FLG) % 31 == 0 判合法,不满足时给出的诊断正是区分“zlib 粘贴”和“裸 deflate 粘贴”的关键:裸 deflate 既没有这 2 字节头也没有 4 字节 adler32 尾,所以同一明文下 deflate 比 deflate-raw 恰好多 6 字节。
常见问题
为什么我的几个字符压缩后反而更大了?
这是 gzip 的固定开销,不是压缩失败。gzip 至少要有 10 字节头和 8 字节尾(CRC32+ISIZE),deflate 内部还要给每块建 Huffman 表;当原文只有几十字节时,这些“包装”比省下的还多,净效果就是膨胀。只有当输入足够大、可重复模式足够多,压缩率才转正。本页用递增样本把这个“交叉规模”实测出来给你看。jpg/png/zip 这类已压过的内容几乎不缩。
为什么同样的文本我用本页和用 gzip 命令行压出来的字节不一样?
因为 Web Compression Streams 不提供压缩级别参数,浏览器用什么级别、什么策略是实现定义的,且不同版本会变。本页展示的压缩率是“本浏览器此刻”的结果,跨工具/跨版本的 gzip 输出不必逐字节相同。要做可复现的字节级比对,请在两端固定同一个库和级别。
解压报“数据被截断”或“校验不过”是怎么回事?
截断指 deflate 流没读完就结束了(常见于复制时少了几字节,或 Base64 被换行/空格截断),页面会转述压缩流抛出的错误;校验不过则是 gzip 的 CRC32/ISIZE 或 zlib 的 adler32 与你解压出的明文对不上,说明数据被改动或本身损坏。这两种都是如实报错,不会给你一个看似成功实则错位的“还原文本”。
改坏 zlib 的尾部字节会怎样?
实测里 DecompressionStream("deflate") 会校验 adler32,改坏尾字节直接抛 Z_DATA_ERROR,这条也如实写在页面上。
对应功能编号 #20无需安装,手机端同样可用按 Ctrl + K 换工具