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
    }
}

说明

  1. compress 函数使用 miniz-sys 的 mz_deflate* 系列函数进行数据压缩
  2. decompress 函数使用 miniz-sys 的 mz_inflate* 系列函数进行数据解压
  3. 注意所有操作都在 unsafe 块中,因为直接调用了 C 语言的 FFI 接口
  4. 示例中包含了错误检查,确保操作成功完成

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(())
}

性能提示

  1. 对于大文件,使用流式处理而不是一次性处理
  2. 调整缓冲区大小以获得更好的性能
  3. 根据需求选择合适的压缩级别(速度vs压缩率)

miniz-sys是一个轻量级但功能强大的压缩解决方案,特别适合需要zlib兼容性但不想引入复杂依赖的项目。

回到顶部