#decompression #byte-sequences #lznt1 #ms-xca #lxpress

rust-lzxpress

简单接口用于Microsoft LZXpress解压缩

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

0.7.1 2021年11月21日
0.7.0 2021年11月21日
0.6.5 2021年8月12日
0.5.0 2021年3月23日
0.1.1 2021年3月17日

#250 in 压缩

每月22次下载

MIT许可证

430KB
403

rust-lzxpress

status

[MS-XCA]: Xpress压缩算法

简介

Xpress压缩算法有三个变体,都是为速度而设计的。最快的变体,Plain LZ77,实现了LZ77算法(UASDC)。一个较慢的变体,LZ77+Huffman,在LZ77数据上添加了一个Huffman编码过程。第三个变体,LZNT1,在第二个变体的Huffman编码过程中没有实现LZ77,但编码过程比Plain LZ77简单。

概述

此算法有效地压缩包含重复字节序列的数据。它不是为压缩图像、音频或视频数据而设计的。在压缩大小和CPU成本之间权衡,它强调降低CPU成本。

与协议和其他算法的关系

此算法不依赖于任何其他算法或协议。它是一种压缩方法,旨在具有最小的压缩和解压缩CPU开销。依赖于此算法的协议通常需要传输大量数据,这些数据不能被具有更好压缩率的另一个算法轻松预压缩。

适用性声明

此算法适用于任何传输大量易于压缩的文本数据(如HTML、源代码或日志文件)的协议。协议使用此算法来减少传输的位数。

此库

此软件包提供了一个简单接口,用于Microsoft Xpress压缩算法。Microsoft Xpress压缩算法更广为人知为LZXpress。此算法有效地压缩包含重复字节序列的数据。它不是为压缩图像、音频或视频数据而设计的。在压缩大小和CPU成本之间权衡时,它强调降低CPU成本。它主要被Microsoft功能或协议(如Microsoft Windows休眠文件、Microsoft SMB协议或甚至是Microsoft Windows 10压缩内存管理)使用。

decompress/compress是简单用例的易于使用的函数。

默认情况下,Windows上的LZXpress使用Plain LZ77算法。您可以在[MS-XCA]文档的2.4 Plain LZ77 Decompression Algorithm Details2.3 Plain LZ77 Compression Algorithm Details部分中了解更多关于它的信息。

示例

Cargo.toml

[dependencies]
rust-lzxpress = "0.7.1"

main.rs

extern crate lzxpress;

use lzxpress;

const TEST_STRING: &'static str = "abcdefghijklmnopqrstuvwxyz";
const TEST_DATA: &'static [u8] = &[ 
                0x3f, 0x00, 0x00, 0x00, 0x61, 0x62, 0x63, 0x64,
                0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,
                0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74,
                0x75, 0x76, 0x77, 0x78, 0x79, 0x7a ];

const TEST_LZNT1_COMPRESSED_DATA: &'static [u8] = include_bytes!("block1.compressed.bin");

fn main() {
    let uncompressed = lzxpress::data::decompress(TEST_DATA).unwrap();

    if let Ok(s) = str::from_utf8(&uncompressed) {
        println!("{}", s);
    }

    let compressed = lzxpress::data::compress(TEST_STRING.as_bytes()).unwrap();
    let uncompressed2 = lzxpress::data::decompress(compressed.as_slice()).unwrap();
    if let Ok(s) = str::from_utf8(&uncompressed2) {
        println!("{}", s);
    }

    // LZNT1
    let uncompressed_lznt1 = lzxpress::lznt1::decompress(TEST_LZNT1_COMPRESSED_DATA).unwrap();
}

没有运行时依赖