#codec #coding #entropy #arithmetic #huffman-coding #ans

rans

rANS (非对称数字系统的范围变体) 编码器和解码器

7个不稳定版本 (3个重大更改)

0.4.0 2024年2月8日
0.3.0 2023年7月12日
0.2.1 2022年7月26日
0.1.2 2022年6月15日
0.1.0 2021年3月29日

#114 in 压缩

每月48次下载

MIT 协议

54KB
979 代码行

rans-rs

Rust Build Status crates.io Documentation MIT licensed codecov

范围非对称数字系统(rANS)编码器和解码器。底层是ryg-rans-sys的高层包装。

ANS是由雅盖隆大学Jarek Duda引入的现代熵编码方法系列。它作为算术和Huffman编码的替代方案,结合了二者的性能和压缩率。许多最近的压缩算法,如Facebook的Zstandard,Apple的LZFSE或JPEG XL,都使用ANS作为底层。

有关底层实现的详细信息,请参阅ryg_rans仓库。

用法

将以下内容添加到您的Cargo.toml

[dependencies]
rans = "0.3.0"

示例

use rans::byte_decoder::{ByteRansDecSymbol, ByteRansDecoder};
use rans::byte_encoder::{ByteRansEncSymbol, ByteRansEncoder};
use rans::{RansDecSymbol, RansDecoder, RansEncSymbol, RansEncoder, RansEncoderMulti};

const SCALE_BITS: u32 = 2;

// Encode two symbols
let mut encoder = ByteRansEncoder::new(1024);
let symbol1 = ByteRansEncSymbol::new(0, 2, SCALE_BITS);
let symbol2 = ByteRansEncSymbol::new(2, 2, SCALE_BITS);

encoder.put(&symbol1);
encoder.put(&symbol2);
encoder.flush();

let mut data = encoder.data().to_owned();

// Decode the encoded data
let mut decoder = ByteRansDecoder::new(data);
let symbol1 = ByteRansDecSymbol::new(0, 2);
let symbol2 = ByteRansDecSymbol::new(2, 2);

// Please note that the data is being decoded in reverse
assert_eq!(decoder.get(SCALE_BITS), 2); // Decoder returns cumulative frequency
decoder.advance(&symbol2, SCALE_BITS);
assert_eq!(decoder.get(SCALE_BITS), 0);
decoder.advance(&symbol1, SCALE_BITS);

许可证

该项目受MIT许可证的许可。

贡献

除非您明确声明,否则您提交给项目包含的贡献将按MIT许可,不附加任何额外条款或条件。

开发

pre-commit

我们鼓励贡献者使用预定义的pre-commit钩子 --- 在您的本地仓库中安装它们,请确保您已安装pre-commit并运行

pre-commit install

依赖关系

~0.3–2.4MB
~42K SLoC