Rust压缩与解压库miniz-sys的使用,miniz-sys提供高性能的zlib压缩与解压功能
Rust压缩与解压库miniz-sys的使用,miniz-sys提供高性能的zlib压缩与解压功能
miniz-sys 是 Rust 的一个外部 FFI 绑定库,提供了高性能的 zlib 压缩与解压功能。它是 flate2 库的底层依赖之一。
安装
在项目目录中运行以下 Cargo 命令:
cargo add miniz-sys
或者在 Cargo.toml 中添加:
miniz-sys = "0.1.12"
示例代码
以下是一个使用 miniz-sys 进行压缩和解压的完整示例:
extern crate miniz_sys;
use std::ptr;
use std::ffi::CString;
fn main() {
// 原始数据
let input = b"Hello, this is a test string for compression and decompression using miniz-sys!";
// 压缩
let compressed = compress(input);
println!("Compressed size: {}", compressed.len());
// 解压
let decompressed = decompress(&compressed);
println!("Decompressed data: {:?}", String::from_utf8_lossy(&decompressed));
}
fn compress(input: &[u8]) -> Vec<u8> {
unsafe {
// 初始化压缩流
let mut stream: miniz_sys::mz_stream = std::mem::zeroed();
let status = miniz_sys::mz_deflateInit(&mut stream, miniz_sys::MZ_DEFAULT_COMPRESSION as i32);
assert_eq!(status, miniz_sys::MZ_OK);
// 准备输出缓冲区
let mut output = Vec::with_capacity(input.len());
let mut out_len = output.capacity() as u32;
// 压缩数据
let status = miniz_sys::mz_deflate(
&mut stream,
miniz_sys::MZ_FINISH as i32,
&mut out_len,
output.as_mut_ptr() as *mut _,
input.as_ptr() as *const _,
input.len() as u32,
);
assert_eq!(status, miniz_sys::MZ_STREAM_END);
// 设置输出长度
output.set_len(out_len as usize);
// 清理压缩流
miniz_sys::mz_deflateEnd(&mut stream);
output
}
}
fn decompress(input: &[u8]) -> Vec<u8> {
unsafe {
// 初始化解压流
let mut stream: miniz_sys::mz_stream = std::mem::zeroed();
let status = miniz_sys::mz_inflateInit(&mut stream);
assert_eq!(status, miniz_sys::MZ_OK);
// 准备输出缓冲区
let mut output = Vec::with_capacity(input.len() * 2);
let mut out_len = output.capacity() as u32;
// 解压数据
let status = miniz_sys::mz_inflate(
&mut stream,
miniz_sys::MZ_FINISH as i32,
&mut out_len,
output.as_mut_ptr() as *mut _,
input.as_ptr() as *const _,
input.len() as u32,
);
assert_eq!(status, miniz_sys::MZ_STREAM_END);
// 设置输出长度
output.set_len(out_len as usize);
// 清理解压流
miniz_sys::mz_inflateEnd(&mut stream);
output
}
}
说明
compress
函数使用 miniz-sys 的mz_deflate*
系列函数进行数据压缩decompress
函数使用 miniz-sys 的mz_inflate*
系列函数进行数据解压- 注意所有操作都在
unsafe
块中,因为直接调用了 C 语言的 FFI 接口 - 示例中包含了错误检查,确保操作成功完成
miniz-sys 提供了对 zlib 的底层绑定,适合需要高性能压缩/解压的场景。对于更高级的封装,可以考虑使用 flate2 库。
1 回复
Rust压缩与解压库miniz-sys使用指南
miniz-sys是Rust的一个轻量级绑定库,提供了对miniz(一个zlib兼容的压缩库)的访问,支持高性能的压缩和解压功能。
特性
- 纯Rust实现,无外部依赖
- 兼容zlib格式
- 支持内存压缩和解压
- 高性能,低内存占用
添加依赖
在Cargo.toml中添加:
[dependencies]
miniz-sys = "0.1"
基本用法
压缩数据
extern crate miniz_sys;
use std::io::{self, Write};
use miniz_sys::*;
fn compress_data(data: &[u8]) -> io::Result<Vec<u8>> {
let mut compressor = Compressor::new();
let mut output = Vec::new();
compressor.write_all(data)?;
compressor.finish(&mut output)?;
Ok(output)
}
解压数据
fn decompress_data(compressed_data: &[u8]) -> io::Result<Vec<u8>> {
let mut decompressor = Decompressor::new();
let mut output = Vec::new();
decompressor.write_all(compressed_data)?;
decompressor.finish(&mut output)?;
Ok(output)
}
高级用法
自定义压缩级别
fn compress_with_level(data: &[u8], level: CompressionLevel) -> io::Result<Vec<u8>> {
let mut compressor = Compressor::with_level(level);
let mut output = Vec::new();
compressor.write_all(data)?;
compressor.finish(&mut output)?;
Ok(output)
}
流式压缩
fn stream_compress<R: Read, W: Write>(mut reader: R, mut writer: W) -> io::Result<()> {
let mut compressor = Compressor::new();
let mut buffer = [0; 4096];
loop {
let bytes_read = reader.read(&mut buffer)?;
if bytes_read == 0 {
break;
}
compressor.write_all(&buffer[..bytes_read])?;
writer.write_all(&compressor.get_output())?;
}
compressor.finish(&mut writer)?;
Ok(())
}
完整示例代码
// 引入必要的库
extern crate miniz_sys;
use std::io::{self, Read, Write};
use miniz_sys::*;
fn main() -> io::Result<()> {
// 示例1: 基本压缩解压
let original_data = b"This is some test data that we want to compress";
println!("=== 基本压缩解压示例 ===");
let compressed = compress_data(original_data)?;
println!("压缩后大小: {} (原始大小: {})", compressed.len(), original_data.len());
let decompressed = decompress_data(&compressed)?;
assert_eq!(&decompressed[..], &original_data[..]);
println!("解压成功,数据匹配!");
// 示例2: 自定义压缩级别
println!("\n=== 自定义压缩级别示例 ===");
let high_compressed = compress_with_level(original_data, CompressionLevel::BestCompression)?;
println!("最佳压缩后大小: {}", high_compressed.len());
let fast_compressed = compress_with_level(original_data, CompressionLevel::Fastest)?;
println!("快速压缩后大小: {}", fast_compressed.len());
// 示例3: 流式压缩
println!("\n=== 流式压缩示例 ===");
let large_data = vec![0u8; 1024 * 1024]; // 1MB数据
let mut compressed_stream = Vec::new();
stream_compress(&large_data[..], &mut compressed_stream)?;
println!("流式压缩后大小: {}", compressed_stream.len());
Ok(())
}
// 基本压缩函数
fn compress_data(data: &[u8]) -> io::Result<Vec<u8>> {
let mut compressor = Compressor::new();
let mut output = Vec::new();
compressor.write_all(data)?;
compressor.finish(&mut output)?;
Ok(output)
}
// 基本解压函数
fn decompress_data(compressed_data: &[u8]) -> io::Result<Vec<u8>> {
let mut decompressor = Decompressor::new();
let mut output = Vec::new();
decompressor.write_all(compressed_data)?;
decompressor.finish(&mut output)?;
Ok(output)
}
// 带压缩级别的压缩函数
fn compress_with_level(data: &[u8], level: CompressionLevel) -> io::Result<Vec<u8>> {
let mut compressor = Compressor::with_level(level);
let mut output = Vec::new();
compressor.write_all(data)?;
compressor.finish(&mut output)?;
Ok(output)
}
// 流式压缩函数
fn stream_compress<R: Read, W: Write>(mut reader: R, mut writer: W) -> io::Result<()> {
let mut compressor = Compressor::new();
let mut buffer = [0; 4096];
loop {
let bytes_read = reader.read(&mut buffer)?;
if bytes_read == 0 {
break;
}
compressor.write_all(&buffer[..bytes_read])?;
writer.write_all(&compressor.get_output())?;
}
compressor.finish(&mut writer)?;
Ok(())
}
性能提示
- 对于大文件,使用流式处理而不是一次性处理
- 调整缓冲区大小以获得更好的性能
- 根据需求选择合适的压缩级别(速度vs压缩率)
miniz-sys是一个轻量级但功能强大的压缩解决方案,特别适合需要zlib兼容性但不想引入复杂依赖的项目。