#z80 #8-bit #gamedev

bin+lib zx0

A ZX0 压缩算法的 Rust 实现

1 个稳定版本

1.0.0 2022年6月22日

#360压缩

BSD-3-Clause 协议

36KB
626

A ZX0 压缩算法的 Rust 实现

本框架提供了一个 Rust 实现的 Einar Saukas 的优秀 ZX0 压缩算法。

本框架提供的算法是对原始基于 C 的实现的优化变体,因此比原始实现快约 40%。此外,Rust 实现还提供了线程安全,这意味着现在可以并行压缩文件。最后,本实现没有内存泄漏。

为了确保正确性,本框架提供了一个包含原始 C 代码 Rust 封装的子框架。此封装在本框架的测试套件中用作参考,以确保其输出与原始实现完全相同。

压缩器可以使用两种方式使用

  1. 通过实例化一个 Compressor 实例,配置它,并调用其 compress 方法。

  2. 使用顶层的 compress 快捷函数以默认设置压缩。

请参阅 Compressor 结构的文档以获取有关如何使用本框架的更多信息,或检查框架源代码中提供的示例。

此外,Einar Saukas 原始实现的 readme 文件 中提供了大量信息。

命令行工具

ZX0 Rust 框架附带了一个压缩器的命令行版本。此实用程序可以使用以下方式安装

$ cargo install zx0

这将安装一个 zx0 二进制文件,可以用来从命令行压缩文件。

命令行压缩器可以这样使用

$ zx0 input_file output_file.zx0

命令行压缩器支持库提供的所有功能。请运行 zx0 --help 以获取所有功能和如何使用的概述。

用法

要开始在您的项目中使用 ZX0 压缩器,请将以下行添加到您的 Cargo 依赖项中

zx0 = "1.0.0"

然后可以通过提供的结构调用压缩器

use zx0::Compressor;

let result = Compressor::new().compress(input_slice);

// From here you can access the compressed data with result.output, and
// retrieve any compressor metadata such as the "delta" value by accessing the
// other struct members.

或者,如果您只需要压缩一些数据并在某处使用压缩后的输出数据,您可以使用此快捷方式

let output_vec = zx0::compress(input_slice);

高级用法

Compressor 结构提供了构建器风格的配置上下文。通过调用一些额外的函数,压缩器可以与原始基于 C 的版本完全相同地进行配置。

use zx0::Compressor;

let result = Compressor::new()
    .skip(128)            // Prefix/suffix skipping
    .backwards_mode(true) // Backward compression
    .quick_mode(true)     // Quick but less efficient compression
    .classic_mode(true)   // V1 file format
    .compress(input_slice);

此外,还可以指定一个进度回调。该回调将在压缩过程中定期调用,并会提供从 0.01.0 的进度值。

use zx0::Compressor;

let result = Compressor::new()
    .progress_callback(|progress| {
        println!("Compression progress: {:.2} percent", progress * 100.0);
    })
    .compress(input_slice);

有关如何使用跳过和反向模式功能的更多信息,请参阅 Einar Saukas 原始实现的 readme 文件

许可证

与原始 C 实现一样,此 crate 中的压缩器和所有其他代码均根据 3-clause BSD 许可证发布。

无运行时依赖