What are Filters?
Filters preprocess data to make it more compressible:- Filter - Transform data (e.g., convert relative jumps in executables)
- Compress - Apply LZMA or other compression
- Result - Better compression ratio
Available Filters
BCJ Filters (Branch-Call-Jump)
Designed for executable files:Delta Filter
Method ID:03
For data with small numeric differences:
- BMP images
- WAV audio
- Numeric data arrays
- Database dumps
BCJ Filter (x86)
How BCJ Works
Converts relative jumps and calls in x86 code to absolute addresses: Original x86 code:Using BCJ Filter
7-Zip automatically applies BCJ filter to .exe and .dll files when compressing to 7z format.
Compression Improvement
Typical compression improvement with BCJ:BCJ2 Filter
Advanced x86 Filter
BCJ2 is a more sophisticated filter that separates executable code into multiple streams:- Main data stream
- CALL/JMP targets
- JUMP targets
- Control bytes
BCJ vs BCJ2
BCJ2 provides 2-5% better compression than BCJ but is slower to compress and decompress.
ARM Filters
ARM (Little-Endian)
ARM64 / AArch64
ARMT (ARM Thumb)
Delta Filter
For data with small differences between consecutive bytes:1- Adjacent bytes (8-bit images)2- 16-bit values (stereo audio)4- 32-bit values (RGB images, int arrays)
Delta Example
Original data:Filter Chains
Combine multiple filters:Automatic Filter Selection
7-Zip automatically selects filters based on file extension:Filter Implementation
Filter source code locations:- BCJ:
C/Bra86.c(lines 1-124) - BCJ2:
C/Bcj2.c(lines 1-274) - ARM:
C/Bra.c(ARM filter section) - ARM64:
C/Bra.c(ARM64 filter section) - Delta:
C/Delta.c(lines 1-93)
BCJ Assembly Optimization
Optimized versions with x86-64 assembly:Asm/x86/7zCrcOpt.asm- CRC with BCJ preprocessing- Uses SIMD instructions for faster filtering