Quantum Compression
Purpose
This guide explains Quantum compression, a legacy statistical compression algorithm used in older CAB files.
Concepts
What is Quantum?
Quantum is a statistical compression algorithm developed by David Stafford for Microsoft. It uses probability modeling and arithmetic coding to achieve good compression ratios.
Performance characteristics
| Metric | Value |
|---|---|
Compression ratio | 45-65% for text, 35-55% for executables |
Compression speed | Medium (5-15 MB/s) |
Decompression speed | Medium (10-50 MB/s) |
Memory usage | Medium to High (window-dependent) |
Window size | Configurable: 2^10 to 2^21 bytes (1 KB to 2 MB) |
Window Sizes
| Bits | Window Size | Notes |
|---|---|---|
10 | 1 KB | Minimum size |
15 | 32 KB | Typical small files |
16 | 64 KB | Default |
18 | 256 KB | Large files |
21 | 2 MB | Maximum size |
Algorithm Details
Comparison
| Algorithm | Ratio | Speed | Recommended |
|---|---|---|---|
LZSS | 30-50% | Fast | Yes (for SZDD/HLP) |
MSZIP | 40-60% | Medium | Yes (default) |
LZX | 50-70% | Slow | Yes (for distribution) |
Quantum | 45-65% | Medium | No (legacy only) |
When to Use Quantum
Use Quantum only when:
-
Compatibility required - Legacy CAB files use Quantum
-
Extracting old files - Decompressing existing Quantum CABs
-
Historical reasons - Maintaining old systems
Do NOT use Quantum for:
-
New applications - Use MSZIP or LZX instead
-
Maximum compression - LZX is better
-
Maximum speed - LZSS or None is faster
-
Non-CAB formats - Not supported
Recommended Alternatives
Instead of Quantum, use:
| Use Case | Recommended | Why |
|---|---|---|
General purpose | MSZIP | Better support, similar ratio |
Maximum compression | LZX | Higher ratio, wider support |
Maximum speed | LZSS or None | Faster compression/decompression |
Legacy compatibility | Quantum | Only valid use case |
Examples
Extract Legacy CAB
require 'cabriolet'
# Decompress old Quantum CAB
decompressor = Cabriolet::CAB::Decompressor.new
cabinet = decompressor.open('old-archive.cab')
cabinet.files.each do |file|
puts "#{file.filename} - Quantum compressed"
end
decompressor.extract_all(cabinet, 'output/')Convert to Modern Format
require 'cabriolet'
# Extract Quantum CAB
old_decompressor = Cabriolet::CAB::Decompressor.new
old_cabinet = old_decompressor.open('quantum.cab')
old_decompressor.extract_all(old_cabinet, 'temp/')
# Re-compress with MSZIP
new_compressor = Cabriolet::CAB::Compressor.new(compression: :mszip)
Dir.glob('temp/**/*').each do |file|
next if File.directory?(file)
new_compressor.add_file(file)
end
new_compressor.write('mszip.cab')
puts "Converted Quantum → MSZIP"Identify Compression Type
require 'cabriolet'
decompressor = Cabriolet::CAB::Decompressor.new
cabinet = decompressor.open('archive.cab')
cabinet.folders.each_with_index do |folder, i|
case folder.compression
when :quantum
puts "Folder #{i}: Quantum (legacy)"
when :mszip
puts "Folder #{i}: MSZIP (recommended)"
when :lzx
puts "Folder #{i}: LZX (maximum compression)"
when :none
puts "Folder #{i}: Uncompressed"
end
endTroubleshooting
"Unsupported Quantum"
If you see experimental/unsupported warnings:
-
Quantum support is limited
-
Use for extraction only
-
Don’t create new Quantum CABs
Migration Guide
To migrate from Quantum:
-
Extract existing CABs
ruby decompressor = Cabriolet::CAB::Decompressor.new decompressor.open('quantum.cab') decompressor.extract_all(cabinet, 'extracted/') -
Re-compress with MSZIP or LZX
ruby compressor = Cabriolet::CAB::Compressor.new(compression: :mszip) # or compressor = Cabriolet::CAB::Compressor.new(compression: :lzx) -
Test thoroughly
bash cabriolet test new-archive.cab
Best practices
-
Avoid for new files - Use MSZIP or LZX instead
-
Extract only - Don’t create new Quantum CABs
-
Convert old files - Migrate to modern algorithms
-
Document usage - Note why Quantum is used if required
-
Test compatibility - Verify decompression works
Technical Notes
See also
-
LZX Compression for recommended alternative
-
Performance Tuning for maximum compression