msrtc-rans-core
Deterministic, no_std-capable rANS primitives for the msrtc_rans entropy coder.
This crate implements the raw rANS encoding and decoding primitives used by Microsoft MLVC's msrtc_rans package. The arithmetic (reciprocal preparation, Mul64Hi, fast division) is structurally faithful to the C++ implementation.
Status — Raw Engine Sealed ✅
| Court | Status |
|---|---|
| Raw encoder differential | ✅ Sealed (8/8 cases) |
| Raw decoder differential | ✅ Sealed (16/16 cases) |
Both RansByteEncoder / RansByteDecoder (u32 state, u8 unit) and Rans64Encoder / Rans64Decoder (u64 state, u32 unit) have been verified byte-for-byte against the pinned Microsoft C++ oracle. All 30 core tests pass.
Features
#![no_std]— suitable for embedded and WASM targets#![forbid(unsafe_code)]— pure safe Rust- Macro-generated variants from a single
generate_rans_impl!macro VecSink(reverse-order, matching C++ResizableBufferSinkbehavior)SliceSource(zero-copy span-like source) withseek(pos)for continuation decodingDecoder::from_state(source, state)— construct a decoder with a saved state (persistent stream decoding)- Checked API:
try_new(),try_put_raw(),try_get(),try_advance() - Transactional decoder — state not committed on failed advance
Usage
use ;
use VecSink;
use SliceSource;
let sink = new;
let mut encoder = new;
encoder.put_raw;
encoder.flush;
let encoded = encoder.into_sink.encoded.to_vec;
let source = new;
let mut decoder = new;
assert!;
assert!;
assert!;
Persistent continuation (stream mode)
use ;
use VecSink;
use SliceSource;
let sink = new;
let mut encoder = new;
encoder.put_raw;
encoder.flush;
let units = encoder.into_sink.encoded.to_vec;
// Save a decode cursor (position + state), then continue later.
let mut source = new;
let mut decoder = new;
assert!;
let pos = decoder.source.position;
let state = decoder.state;
// ... later, from a saved (pos, state):
let mut source2 = new;
source2.seek;
let mut decoder2 = from_state;
Repository
Full project: github.com/infinityabundance/msrtc-rans-rs