使用壓縮 API
許多應用程式都需要使用無遺失的數據壓縮和解壓縮。 壓縮 API 可透過公用 API 公開 Windows 壓縮演算法來簡化此作業。 每個壓縮演算法都有一組可控制其行為的屬性。 壓縮 API 公開介面,可讓開發人員設定或查詢這些屬性的值。 支援壓縮演算法的所有屬性都有預設值,代表這些屬性的常用值。 如果壓縮和解壓縮都需要 屬性,則預設值會相同,以確保會使用相同的值進行壓縮和解壓縮。
選取壓縮演算法
開發人員決定應用程式需要壓縮或解壓縮數據之後,下一個步驟是選擇壓縮演算法。 這可能取決於測試,以找出特定應用程式速度、壓縮比例和記憶體需求的最佳效能組合。 下列清單提供壓縮 API 目前支援的壓縮演算法相對比較。 並非所有選項都可用於每個壓縮演算法,而且比較是近似的,因為效能可能取決於輸入數據。
XPRESS (COMPRESS_ALGORITHM_XPRESS)
- 使用低資源需求非常快速
- 中度壓縮比例
- 高壓縮和解壓縮速度
- 記憶體需求低
- 支援 COMPRESS_INFORMATION_CLASS 列舉中可用的COMPRESS_INFORMATION_CLASS_LEVEL選項。 預設值為 (DWORD)0。 對於某些數據,值 (DWORD)1 可以透過稍微慢一點的壓縮速度來改善壓縮比例。
XPRESS 與 Huffman 編碼 (COMPRESS_ALGORITHM_XPRESS_HUFF)
- 壓縮比例高於 COMPRESS_ALGORITHM_XPRESS
- 中度壓縮比例
- 中至高壓縮和解壓縮速度
- 記憶體需求低
- 支援 COMPRESS_INFORMATION_CLASS 列舉中的 COMPRESS_INFORMATION_CLASS_LEVEL 選項。 預設值為 (DWORD)0。 對於某些數據,值 (DWORD)1 可以透過稍微慢一點的壓縮速度來改善壓縮比例。
MSZIP (COMPRESS_ALGORITHM_MSZIP)
- 使用的資源超過 COMPRESS_ALGORITHM_XPRESS_HUFF
- 產生類似於 RFC 1951 的壓縮區塊。
- 中至高壓縮比率
- 中壓縮速度和高解壓縮速度
- 中記憶體需求
LZMS (COMPRESS_ALGORITHM_LZMS)
- 如果要壓縮的數據大小超過 2MB,則為良好的演算法。
- 高壓縮率
- 低壓縮速度和高解壓縮速度
- 中至高記憶體需求
- 支援 COMPRESS_INFORMATION_CLASS 列舉中的 COMPRESS_INFORMATION_CLASS_BLOCK_SIZE 選項。 建議最小大小為 1 MB,以取得較佳的壓縮比例。
決定要使用的壓縮 API 模式
在開發人員選取壓縮演算法之後,下一個決策是壓縮 API 要使用的兩種模式:緩衝區模式或區塊模式。 緩衝區模式是為了方便使用而開發,而且建議在大部分情況下使用。
緩衝區模式會自動將輸入緩衝區分割成適合所選壓縮演算法的大社區塊。 緩衝區模式會自動格式化,並將未壓縮的緩衝區大小儲存在壓縮的緩衝區中。 壓縮緩衝區的大小不會自動儲存,而且應用程式需要儲存此專案以進行解壓縮。 當您呼叫 CreateCompressor 和 CreateDecompressor 以使用緩衝區模式時,請勿在 Algorithm 參數中包含COMPRESS_RAW旗標。 如需緩衝區模式應用程式的程式代碼範例,請參閱 在緩衝區模式 中使用壓縮 API 一節。
區塊模式可讓開發人員控制區塊大小,但應用程式需要執行更多工作。 使用區塊模式時,應用程式在壓縮時,必須將輸入數據分成適當大小的片段,然後在解壓縮時將片段放回一起。 如果輸入緩衝區的大小大於壓縮演算法的內部區塊大小,則區塊模式會失敗。 MSZIP 的內部區塊大小為 32KB,XPRESS 壓縮演算法為 1GB。 LZMS 的內部區塊大小可設定為 64GB,記憶體使用量會相應增加。 壓縮緩衝區的大小不會自動儲存,而且應用程式也需要儲存此大小以進行解壓縮。 Decompress 的 UncompressedBufferSize 參數值必須完全符合未壓縮數據的原始大小,而不只是輸出緩衝區的大小。 這表示您的應用程式在使用區塊模式時,應該儲存未壓縮數據的確切原始大小,以及壓縮的數據和壓縮大小。 當您呼叫 CreateCompressor 和 CreateDecompressor 以使用區塊模式時,請在 Algorithm 參數中包含COMPRESS_RAW旗標。 如需區塊模式應用程式的程式代碼範例,請參閱 在區塊模式 中使用壓縮 API 一節。
自訂記憶體配置
緩衝區和區塊模式應用程式可以選擇在呼叫 CreateCompressor 和 CreateDecompressor 時指定自定義記憶體配置例程。 AllocationRoutines 參數會指定包含記憶體配置例程的COMPRESS_ALLOCATION_ROUTINES結構。 然後,應用程式可以使用 SetCompressorInformation 來設定壓縮機的區塊大小。 如需簡單的自定義配置例程範例,請參閱在區塊模式中使用壓縮 API 一節。