#delta-compression #delta #bsdiff #suffix-array #compatible #memory #patch

bin+lib qbsdiff

Fast and memory saving bsdiff 4.x compatible delta compressor and patcher

14 releases (stable)

1.4.2 Apr 15, 2024
1.4.1 Jun 22, 2023
1.4.0 Sep 17, 2021
1.3.1 Apr 25, 2020
0.1.2 Oct 17, 2019

#62 in Compression

Download history 96/week @ 2024-08-17 89/week @ 2024-08-24 77/week @ 2024-08-31 32/week @ 2024-09-07 56/week @ 2024-09-14 105/week @ 2024-09-21 79/week @ 2024-09-28 39/week @ 2024-10-05 37/week @ 2024-10-12 147/week @ 2024-10-19 115/week @ 2024-10-26 90/week @ 2024-11-02 34/week @ 2024-11-09 126/week @ 2024-11-16 195/week @ 2024-11-23 250/week @ 2024-11-30

612 downloads per month
Used in 5 crates (4 directly)

MIT license

42KB
799 lines

qbsdiff

crates docs dependency status

Fast and memory saving bsdiff 4.x compatible delta compressor and patcher.

Add dependency to Cargo.toml:

[dependencies]
qbsdiff = "1.4"

Build commands

Build qbsdiff and qbspatch commands:

$ cargo build --release --bins --features cmd
$ cd target/release
$ ./qbsdiff --help
$ ./qbspatch --help

Install commands to $CARGO_HOME/bin:

$ cargo install qbsdiff --features cmd

Examples

Produce the target stream by applying patch to source:

use std::io;
use qbsdiff::Bspatch;

fn bspatch(source: &[u8], patch: &[u8]) -> io::Result<Vec<u8>> {
    let patcher = Bspatch::new(patch)?;
    let mut target = Vec::new();
    // To preallocate target:
    //Vec::with_capacity(patcher.hint_target_size() as usize);
    patcher.apply(source, io::Cursor::new(&mut target))?;
    Ok(target)
}

Produce the patch data by comparing source with target:

use std::io;
use qbsdiff::Bsdiff;

fn bsdiff(source: &[u8], target: &[u8]) -> io::Result<Vec<u8>> {
    let mut patch = Vec::new();
    Bsdiff::new(source, target)
        .compare(io::Cursor::new(&mut patch))?;
    Ok(patch)
}

Note that qbsdiff would not generate exactly the same patch file as bsdiff. Only the patch file format is promised to be compatible.

Dependencies

~2–3MB
~52K SLoC