文章目录
-
-
- 核心特点与优势
- [Brotli 是如何工作的?](#Brotli 是如何工作的?)
- 主要应用场景
- 兼容性
- [与 GZip (Deflate) 的对比](#与 GZip (Deflate) 的对比)
- 总结
- 概览
- 过滤器详解
-
- [1. 无损压缩过滤器(常用于文本、矢量数据)](#1. 无损压缩过滤器(常用于文本、矢量数据))
- [2. 图像专用压缩过滤器](#2. 图像专用压缩过滤器)
- [3. 二进制到文本编码(非压缩)](#3. 二进制到文本编码(非压缩))
- [4. 安全过滤器](#4. 安全过滤器)
- 核心结论与总结
- [📊 为什么 Brotli 不直接用于 PDF 压缩](#📊 为什么 Brotli 不直接用于 PDF 压缩)
- [🔄 Brotli 间接助力 PDF 处理](#🔄 Brotli 间接助力 PDF 处理)
- [📌 如何有效压缩 PDF 文件](#📌 如何有效压缩 PDF 文件)
- [💎 总结](#💎 总结)
- 核心结论:大小对比
- 二者的详细区别
- 关键概念澄清:编码与过滤器
- 总结
- 头文件
- 实现文件
- 使用方式
-
好的,为您全面介绍一下 Brotli 压缩算法。
Brotli(发音类似 "bread-lee" 或 "brot-lee")是一种现代化的、开源的无损数据压缩算法,由 Google 开发并于 2015 年发布。它被设计用来在互联网上高效压缩数据,以期取代更老的 Zlib (Deflate/GZip) 算法,成为新的压缩标准。
核心特点与优势
-
极高的压缩密度
Brotli 的核心优势在于其极高的压缩率 。在压缩级别可调的最高模式下(级别 11),它通常能生成比 Zlib/GZip 小 20% - 26% 的文件。这意味着在传输相同内容时,所需的数据量更少。
-
设计目标:Web 内容
Brotli 专门为压缩 Web 文本内容(如 HTML, CSS, JavaScript, JSON, SVG, fonts 等)进行了优化。其内置了一个预定义的静态字典 ,包含了大量常见的单词、标记和字符序列(例如
<!DOCTYPE html>
,function
,div
等),这使得它在压缩这类文件时效率极高,无需为每个文件重新计算这些常见模式。 -
灵活的压缩速度与比率权衡
Brotli 提供了 0 到 11 共 12 个压缩级别:
-
级别 0-4:压缩速度非常快,但压缩率相对较低。适用于需要快速响应的场景。
-
级别 5-11 :压缩速度会显著变慢(尤其是最高级别),但压缩率也达到极致。这非常适合预压缩场景(比如在服务器上提前压缩好静态资源),因为压缩只需一次,而解压则会发生成千上万次。
-
-
无损压缩
与 GZip 一样,Brotli 是一种无损压缩算法。解压后的数据与原始数据完全一致,比特对比特相同。
Brotli 是如何工作的?
Brotli 并非完全 revolutionary 的技术,它巧妙地结合并改进了多种成熟的压缩技术:
-
LZ77 算法:首先使用 LZ77 算法来查找并消除数据中的重复字符串和模式,用(距离,长度)对来替换它们。
-
Huffman 编码:然后使用 Huffman 编码来进一步压缩数据,将出现频率更高的符号用更短的比特序列表示。
-
第二上下文建模:这是 Brotli 的一大创新。它使用第二阶段的建模技术来更好地预测和压缩数据,尤其是在最高压缩级别下。
-
预定义静态字典:如前所述,这个包含超过 13000 个常见单词和短语的字典是其针对 Web 内容表现卓越的关键。
主要应用场景
Brotli 的应用几乎完全集中在 Web 性能优化领域:
-
HTTP 内容压缩:这是 Brotli 最主流的用途。Web 服务器(如 Nginx, Apache, CDN)可以配置为使用 Brotli 来压缩它们发送给浏览器的文本资源。浏览器在接收后会自动解压并渲染内容。
-
HTTP 头标识 :服务器通过在
Content-Encoding
响应头中设置br
来告知浏览器内容已用 Brotli 压缩。 -
示例 :
Content-Encoding: br
-
-
Webpack / 构建工具压缩 :在前端构建流程中,可以使用插件(如
compression-webpack-plugin
)在构建阶段预先用 Brotli 最高级别压缩静态资源,生成.js.br
和.css.br
文件。服务器只需直接提供这些预压缩文件,节省了实时压缩的 CPU 开销。 -
其他数据传输:任何需要高效压缩文本或结构化数据(如 API 响应)的场景都可以考虑使用 Brotli。
兼容性
-
浏览器:所有现代浏览器(Chrome, Firefox, Edge, Safari, Opera)都已支持 Brotli 解码。
-
服务器 :主流的 Web 服务器(Nginx, Apache)和 CDN 服务商(Cloudflare, AWS CloudFront, Akamai等)都已支持 Brotli 压缩。通常需要安装并配置额外的模块(如 Nginx 的
ngx_brotli
模块)。
与 GZip (Deflate) 的对比
特性 | Brotli | GZip (Deflate) |
---|---|---|
压缩率 | 更高(尤其在最高级别) | 较低 |
压缩速度 | 较慢(高级别下非常慢) | 较快 |
解压速度 | 非常快(与 GZip 相当甚至更快) | 非常快 |
字典 | 包含强大的预定义静态字典 | 无预定义字典 |
压缩级别 | 0-11 | 1-9 |
HTTP 头值 | br |
gzip , deflate |
通用性 | 现代 Web 的新标准 | 历史悠久,无处不在 |
总结
Brotli 是一种专为 Web 设计的高效压缩算法,通过在压缩阶段投入更多计算资源,来极大减少传输的数据量,从而显著提升网页加载速度并节省带宽。
虽然它的高压缩级别对服务器 CPU 的消耗更大,但通过预压缩静态资源可以完美规避这个问题。对于动态内容,可以使用中等级别(如 4-6)在压缩速度和压缩率之间取得良好平衡。
对于现代网站和应用程序,启用 Brotli 压缩是一项非常重要的性能优化最佳实践。
好的,这是一份对您提供的PDF过滤器列表的详细介绍、分析和总结。这个列表描述了PDF标准中用于解码流对象数据的各种方法。
概览
这些过滤器(Filters)在PDF中通过流字典(Stream Dictionary)中的 /Filter
或 /DecodeParms
关键字指定。它们用于在将数据存入PDF或从PDF读取时进行编码(压缩/加密)或解码(解压/解密)。
您提供的列表中的"Predictor"一栏非常关键,它指的是该过滤器是否常与一个预测函数(Predictor) 配合使用,以进一步提升压缩率(尤其对于图像数据或平滑渐变的数据)。
过滤器详解
1. 无损压缩过滤器(常用于文本、矢量数据)
过滤器 | Predictor? | 说明 |
---|---|---|
FlateDecode | 是 | 这是PDF中最重要、最通用的无损压缩算法。 它基于zlib/deflate(与Zip文件使用的算法同源)。几乎所有的现代PDF生成器都会默认使用它来压缩文本字符串、命令流和元数据。Predictor 尤其与此过滤器相关,用于优化压缩像素数据(如PNG图像)。 |
LZWDecode | 是 | 基于LZW(Lempel-Ziv-Welch)算法。这是FlateDecode之前的一种较老的无损压缩方法。由于专利问题和Flate的更优性能,现在已很少使用。 |
RunLengthDecode | 否 | 一种非常简单的基于游程编码(RLE)的压缩方式。对于包含大量连续重复字节的数据(如单色位图的掩码)非常有效,但对于复杂数据压缩率很低。 |
2. 图像专用压缩过滤器
过滤器 | Predictor? | 说明 |
---|---|---|
DCTDecode | 否 | 实际上就是JPEG压缩。 这是一种有损 压缩算法,用于压缩彩色或灰度照片图像。它通过丢弃人眼不敏感的高频信息来大幅减小文件体积。Predictor 不适用,因为JPEG本身已经过高度优化。 |
JPXDecode | 否 | 基于JPEG 2000标准。 使用小波变换,相比传统JPEG(DCT),它支持无损压缩、更高压缩率、以及透明通道等特性。 |
CCITTFaxDecode | 否 | 用于压缩1位深度的黑白图像(例如扫描的文档)。 基于传真机组的ITU-T(CCITT)标准。Group 3和Group 4是两种最常用的编码方式,后者效率更高。非常适合由扫描仪生成的单色TIFF图像。 |
JBIG2Decode | 否 | 专门用于压缩黑白图像(1位深度)的现代标准。 相比CCITT Fax,它能提供极高的压缩率。它通过识别和复用页面中的重复字符(如文字文档中的字母'e')来实现压缩。 |
3. 二进制到文本编码(非压缩)
这些方法本身不压缩数据,而是将二进制数据编码为ASCII文本,以确保其在某些旧系统或协议中安全传输(如电子邮件),但会显著增加数据大小。
过滤器 | Predictor? | 说明 |
---|---|---|
ASCIIHexDecode | 否 | 将二进制数据编码为十六进制字符串(例如,字节 0xFF 变成字符 'F' 和 'F' )。数据大小约增加为原来的2倍。 |
ASCII85Decode | 否 | 将二进制数据编码为Base85文本。比十六进制编码更高效,数据大小约增加为原来的 4/5 (1.25倍)。 |
4. 安全过滤器
过滤器 | Predictor? | 说明 |
---|---|---|
Crypt | 否 | 这是一个解密过滤器。 当文档受密码保护或具有权限限制时,文档中的部分或全部流对象会被加密。Crypt 过滤器使用文档的"安全处理器"(Security Handler)来解密数据,重现原始内容。它本身不是一种加密算法,而是一个调用解密功能的接口。 |
核心结论与总结
-
现代PDF的基石 :**
FlateDecode
是压缩文本和矢量数据的绝对主力。DCTDecode
(JPEG)** 是压缩彩色图像的主力。 -
压缩 vs. 编码:
-
压缩过滤器 (如
FlateDecode
,DCTDecode
)旨在减小数据大小。 -
编码过滤器 (如
ASCII85Decode
,ASCIIHexDecode
)旨在改变数据格式以适应传输,通常会增大数据大小。
-
-
Predictor 的作用 :
Predictor
是一个后处理步骤,通常与FlateDecode
或LZWDecode
结合使用。它通过预测像素值(例如,一个像素的值等于左边像素的值)来改变数据,使其包含更多连续的重复字节,从而让后续的无损压缩算法(如Flate)能够获得更高的压缩率。这对于压缩未经JPEG等有损算法处理的图像数据特别有用。 -
关于 BrotliDecode:
-
正如之前的回答所述,BrotliDecode 不是PDF标准过滤器。
-
您的列表中包含的都是PDF规范中定义的官方过滤器,而Brotli是之后出现的、主要用于Web(HTTP内容编码)的压缩算法。
-
虽然Brotli在压缩率上可能优于Flate,但PDF作为一种高度标准化和注重向后兼容性的格式,采纳新算法的过程非常缓慢。所有现有的PDF阅读器都必须支持列表中的这些过滤器,但不支持Brotli。
-
总而言之,您提供的列表完整概述了PDF标准中用于处理流对象数据的所有核心解码技术。在实际应用中,FlateDecode
和 DCTDecode
是您最常遇到的两种。
Brotli 算法本身非常优秀,但 BrotliDecode 并不直接用于 PDF 文件的压缩。这主要是因为 PDF 文件内部结构和使用场景与 Brotli 的设计初衷有所不同。
为了让您快速了解 Brotli 与 PDF 常用压缩算法的区别,这里有一个表格:
特性 | Brotli (BR) | PDF 内部常用压缩算法 (如 Flate/Deflate) |
---|---|---|
算法类型 | 通用无损压缩 | 无损压缩(也支持有损,如JPEG) |
主要应用场景 | HTTP内容压缩、Web资源、文本数据 | PDF 文档内部对象压缩 |
在PDF中的应用 | 不直接用于压缩PDF文件本身 | PDF 标准的一部分,直接用于压缩文本、图像、流对象等 |
压缩率 | 通常较高(尤其对文本) | 良好 |
兼容性 | 需要浏览器和服务端支持 | 所有PDF阅读器均原生支持 |
📊 为什么 Brotli 不直接用于 PDF 压缩
-
PDF 有自己的"压缩生态" :一个 PDF 文件内部就像一个小型文件系统,包含了文本、图片、字体、元数据等多种对象。PDF 标准定义了一系列针对不同内容优化的压缩算法(过滤器),例如:
-
FlateDecode (Zlib/Deflate):最常用,用于压缩文本、矢量图形等数据,这是无损压缩。
-
DCTDecode (JPEG):用于压缩彩色图片,这是有损压缩。
-
CCITTFaxDecode:专门用于压缩黑白图像(如扫描文档)。
-
JBIG2Decode:高效压缩黑白图像,尤其适合包含大量文本的扫描件。
这些算法已经深度集成到 PDF 规范中,所有 PDF 阅读器都能直接识别和解码。
-
-
Brotli 是"外部"压缩 :Brotli 通常用于整个文件的压缩传输,比如:
-
Web 服务器压缩:服务器在发送 HTML、CSS、JS 等文本资源前,可以用 Brotli 压缩,浏览器接收后再用 BrotliDecode 解压。这能显著减小传输数据量,提升网页加载速度。
-
网络传输优化:在 API 接口或数据传输中,也可用 Brotli 压缩请求/响应体。
如果对一个已经内部压缩过的 PDF 文件再用 Brotli 压缩一次,效果可能并不明显,甚至可能变大(因为压缩算法有头部开销)。
-
-
兼容性问题 :即使你将一个 PDF 文件用 Brotli 压缩后命名为
.pdf.br
,也没有任何标准的 PDF 阅读器能直接打开它。你必须先手动(或在代码中)用 BrotliDecode 解压出原始的 PDF 字节,才能用阅读器打开。这增加了额外步骤,降低了通用性。
🔄 Brotli 间接助力 PDF 处理
虽然不直接压缩 PDF 文件本身,但 Brotli 在 PDF 相关场景中仍有价值:
-
优化网络传输 :当 PDF 文件通过网站提供下载 或在线预览时,Web 服务器可以开启 Brotli 压缩(例如在 Nginx 或 Apache 中配置)。这样从服务器传输到用户浏览器的数据量会显著减少,加载更快,节省带宽。用户浏览器下载后会自动解压得到原始 PDF。
-
OCR结果压缩:对通过OCR(光学字符识别)处理后的文本数据,Brotli 这类高效压缩算法能有效减小存储和传输体积。
📌 如何有效压缩 PDF 文件
如果你想减小 PDF 文件的大小,以下方法更直接有效:
-
使用专业的 PDF 工具:Adobe Acrobat、Foxit PhantomPDF 等软件通常提供"优化"或"缩小文件大小"的功能,它们会智能地应用内部压缩算法。
-
在线压缩工具 :许多在线工具(如 iLovePDF、Smallpdf)也提供 PDF 压缩服务,操作简单。注意隐私安全,避免上传敏感文件。
-
调整图像分辨率:如果 PDF 中包含大量图片,降低其 DPI(如从 300 DPI 降到 150 DPI)能大幅减小体积。
-
使用专门的压缩算法:根据PDF内容选择压缩算法:
-
文本和矢量图 :使用 FlateDecode (Zlib)。
-
彩色图片 :使用 JPEG 并调整质量。
-
黑白图像/扫描件 :使用 CCITT Group 4 或 JBIG2。
-
-
移除冗余元素:删除不必要的嵌入字体、注释、元数据或隐藏图层。
-
PDF 打印设置:有时选择"打印"为 PDF,并选择"最小文件大小"选项,也能起到压缩效果。
💎 总结
记住一个简单的比喻:Brotli 压缩的是传输管道 ,而 PDF 内部的算法压缩的是管道里运输的货物本身。
所以,BrotliDecode 不用于直接创建或压缩 PDF 文件本身 ,但可用于加速 PDF 文件在网络上的传输。要直接减小一个 PDF 文件的大小,应使用支持 PDF 内部压缩算法的专业工具或库。
希望这些信息能帮助您更好地理解 Brotli 和 PDF 压缩之间的关系。如果您有任何其他问题,请随时提出!
这是一个非常好的问题,它触及了PDF文件结构和数据编码的核心。
简单直接的回答是:二进制编码更小,十六进制编码更大。
下面我们来详细解释二者的区别和关系。
核心结论:大小对比
-
二进制编码 (Binary Encoding) :这是PDF内容流(如图片、字体、压缩后的页面内容)最原始、最紧凑的存储形式。它直接使用字节(8位)来表示数据,计算机可以无需转换直接理解。因此,它的体积是最小的。
-
十六进制编码 (Hexadecimal Encoding) :这是一种文本表示形式 。它用ASCII字符(0-9, A-F)来表示二进制数据。每1个字节的二进制数据(例如
11111111
)需要2个十六进制字符(FF
)来表示。因此,仅从数据存储的角度看,十六进制编码的体积大约是原始二进制数据的2倍。
二者的详细区别
特性 | 二进制编码 (Binary) | 十六进制编码 (Hexadecimal) |
---|---|---|
本质 | 原始字节数据 | 二进制数据的文本化(ASCII)表示 |
体积 | 小(原始大小) | 大(约为二进制的2倍) |
可读性 | 差(用文本编辑器打开是乱码) | 好(人类可以直接阅读和修改的十六进制字符串) |
处理效率 | 高(计算机可直接处理,无需转换) | 低(需要解析和转换回二进制才能使用) |
在PDF中的常见用法 | PDF文件中绝大多数 内容流(stream ...endstream )都使用二进制编码,尤其是经过 FlateDecode (类似Zip)压缩后的数据。 |
主要用于某些过滤器(Filter) ,例如 ASCIIHexDecode 。相对少见,通常用于非常古老或特殊的场景。 |
关键概念澄清:编码与过滤器
在PDF中,你提到的"编码"通常与一个叫做 过滤器(Filter) 的概念紧密相关。过滤器相当于一种编码或压缩算法,用于在将数据存入PDF流对象之前对其进行处理。
-
无压缩/原始二进制 (常用)
-
过滤器 :
FlateDecode
(最常用的压缩算法) -
数据 : 压缩后的二进制数据。
-
流程 : 原始数据 ->
FlateEncode
(压缩成二进制)-> 存入stream
-> PDF阅读器读取 ->FlateDecode
(解压)-> 得到原始数据。 -
这是最高效、最普遍的方式。
-
-
十六进制过滤器 (不常用)
-
过滤器 :
ASCIIHexDecode
-
数据 : 二进制数据被转换成十六进制ASCII字符串(可能还会伴有空格和换行符)。
-
流程 : 原始二进制数据 -> 转换成十六进制文本 -> 存入
stream
-> PDF阅读器读取 ->ASCIIHexDecode
(将文本转换回二进制)-> 得到原始数据。 -
例子 : 二进制字节
0xFF, 0x1A
在流中会被存储为文本字符串"FF1A"
或"FF 1A"
。
-
-
Base64编码过滤器 (介于二者之间)
-
过滤器 :
ASCII85Decode
(或更古老的Base64
,但PDF标准中用ASCII85
更多) -
数据: 二进制数据被转换成Base85/Base64文本。
-
体积 : 体积增幅约为 1.25倍 (Base85) 或 1.33倍 (Base64),远优于十六进制编码的2倍。
-
用途: 当需要将二进制数据用纯文本表示(例如用于某些嵌入式系统或古老的网络传输),但又希望比十六进制更节省空间时使用。现在也已不常见。
-
总结
-
对于PDF流对象的内容本身 ,使用二进制格式是标准且高效的做法,它的体积远小于十六进制文本表示。
-
十六进制编码 (通过
ASCIIHexDecode
过滤器)是一种将二进制数据"文本化"的古老方式,它会显著增加文件大小,如今已很少在PDF中使用。 -
你可能会在PDF的元数据 或其他描述性部分 看到十六进制字符串(例如标识颜色、对象号等),但流对象(
stream
...endstream
)中的主体内容几乎总是以压缩的二进制形式存在。
因此,当你处理PDF流对象时,你应该始终预期它是二进制的,并准备用相应的压缩库(如Zlib用于 FlateDecode
) 来解压和处理它。
头文件
cpp
#ifndef BROTLI_COMPRESSOR_H
#define BROTLI_COMPRESSOR_H
#include <vector>
#include <memory>
#include <string_view>
#include <cstdint>
#include <cstddef>
// 前向声明实现类(对用户隐藏)
class CompressorImpl;
// Brotli压缩器主类(对外接口)
class BrotliCompressor {
public:
// 压缩级别枚举
enum class Level : uint32_t {
Fastest = 0, // 极速模式(最低压缩率,适用于实时性要求极高的场景)
Fast = 1, // 快速模式(较低压缩率,适用于交互式操作)
Balanced = 3, // 轻度平衡模式(兼顾速度和压缩率)
Default = 6, // 标准平衡模式(推荐默认值)
High = 8, // 高压缩比模式(较慢速度)
Best = 11, // 最高压缩比(最慢速度,适用于归档存储)
};
// 构造函数:创建压缩器实例并指定压缩级别
explicit BrotliCompressor(Level level = Level::Default);
// 析构函数:释放资源
~BrotliCompressor();
// 禁用拷贝构造(Brotli状态不可复制)
BrotliCompressor(const BrotliCompressor&) = delete;
BrotliCompressor& operator=(const BrotliCompressor&) = delete;
// 允许移动构造(转移资源所有权)
BrotliCompressor(BrotliCompressor&&) noexcept;
BrotliCompressor& operator=(BrotliCompressor&&) noexcept;
// 核心压缩方法(原始字节数据)
std::vector<uint8_t> compress(const uint8_t* data, size_t size);
// 字符串视图压缩(自动转换字节数据)
std::vector<uint8_t> compress(std::string_view str);
// 向量数据压缩(便捷接口)
std::vector<uint8_t> compress(const std::vector<uint8_t>& data);
// 静态方法:计算输入数据的最大压缩后大小
static size_t max_compressed_size(size_t input_size);
private:
// Pimpl指针:指向实际实现类
std::unique_ptr<CompressorImpl> pimpl;
};
#endif // BROTLI_COMPRESSOR_HPP
实现文件
cpp
#include "brotli_compressor.h"
#include <stdexcept>
#include "brotli/encode.h"
#include "brotli/shared_dictionary.h"
// === 实现类(对用户完全隐藏) ===
class CompressorImpl {
public:
// 构造函数:初始化Brotli编码器
explicit CompressorImpl(BrotliCompressor::Level level) {
// 创建Brotli编码器实例
encoder_ = BrotliEncoderCreateInstance(&Alloc, &Free, nullptr);
if (!encoder_) throw std::bad_alloc(); // 内存不足时抛出异常
// 设置压缩级别
if (!BrotliEncoderSetParameter(
encoder_,
BROTLI_PARAM_QUALITY,
static_cast<uint32_t>(level))
) {
BrotliEncoderDestroyInstance(encoder_);
throw std::runtime_error("Brotli级别设置失败");
}
}
// 析构函数:清理Brotli资源
~CompressorImpl() {
if (encoder_) BrotliEncoderDestroyInstance(encoder_);
}
// 执行压缩的核心方法
std::vector<uint8_t> compress(const uint8_t* data, size_t size) {
// 检查输入有效性
if (!data && size > 0)
throw std::invalid_argument("输入数据指针为空");
// 预分配输出缓冲区(最大可能大小)
std::vector<uint8_t> output(BrotliEncoderMaxCompressedSize(size));
size_t available_out = output.size();
uint8_t* next_out = output.data();
// 执行压缩操作
if (BrotliEncoderCompressStream(
encoder_,
BROTLI_OPERATION_FINISH, // 一次性压缩全部数据
&size,
&data,
&available_out,
&next_out,
nullptr
) && BrotliEncoderIsFinished(encoder_)) {
// 压缩成功:调整输出缓冲区到实际大小
output.resize(output.size() - available_out);
return output;
}
// 压缩失败抛出异常
throw std::runtime_error("Brotli压缩过程失败");
}
private:
BrotliEncoderState* encoder_ = nullptr; // Brotli编码器状态
// 内存分配回调(使用C++的operator new/delete)
static void* Alloc(void* /*opaque*/, size_t size) {
return ::operator new(size);
}
static void Free(void* /*opaque*/, void* ptr) {
::operator delete(ptr);
}
};
// === BrotliCompressor类成员函数实现 ===
// 构造函数:委托给实现类
BrotliCompressor::BrotliCompressor(Level level)
: pimpl(std::make_unique<CompressorImpl>(level)) {
}
// 析构函数:需显式定义(因unique_ptr需要完整类型)
BrotliCompressor::~BrotliCompressor() = default;
// 移动构造函数(默认行为即可)
BrotliCompressor::BrotliCompressor(BrotliCompressor&&) noexcept = default;
BrotliCompressor& BrotliCompressor::operator=(BrotliCompressor&&) noexcept = default;
// 压缩方法转发给实现类
std::vector<uint8_t> BrotliCompressor::compress(const uint8_t* data, size_t size) {
return pimpl->compress(data, size);
}
// 字符串压缩便捷接口
std::vector<uint8_t> BrotliCompressor::compress(std::string_view str) {
return compress(reinterpret_cast<const uint8_t*>(str.data()), str.size());
}
// 字节向量压缩便捷接口
std::vector<uint8_t> BrotliCompressor::compress(const std::vector<uint8_t>& data) {
return compress(data.data(), data.size());
}
// 静态方法:直接调用Brotli库函数
size_t BrotliCompressor::max_compressed_size(size_t input_size) {
return BrotliEncoderMaxCompressedSize(input_size);
}
使用方式
cpp
#include "brotli_compressor.hpp"
#include <iostream>
int main() {
try {
// 1. 创建压缩器实例(使用最高压缩级别)
brotli::BrotliCompressor compressor(brotli::BrotliCompressor::Level::Best);
// 2. 压缩字符串数据
std::string text = "使用Pimpl模式封装的Brotli压缩库";
auto compressed = compressor.compress(text);
std::cout << "原始大小: " << text.size() << " 字节\n"
<< "压缩后大小: " << compressed.size() << " 字节\n"
<< "压缩率: " << (compressed.size() * 100.0 / text.size()) << "%\n";
// 3. 压缩二进制数据
std::vector<uint8_t> binary_data = { 0x01, 0x02, 0x03, 0x04, 0x05 };
auto binary_compressed = compressor.compress(binary_data);
}
catch (const std::exception& e) {
// 统一错误处理
std::cerr << "发生错误: " << e.what() << std::endl;
return 1;
}
return 0;
}