fn main() {
let input: Vec<u8> = b"ABCD".iter().cycle().take(500).copied().collect();
let ref_compressed = zstd::encode_all(&input[..], 1).unwrap();
println!("Reference compressed: {:02x?}", ref_compressed);
let fse_bytes = &ref_compressed[16..];
println!("FSE bitstream: {:02x?}", fse_bytes);
let bits_u32 = u32::from_le_bytes([fse_bytes[0], fse_bytes[1], fse_bytes[2], fse_bytes[3]]);
println!("\nBits as u32: 0x{:08x} = {:032b}", bits_u32, bits_u32);
let sentinel_pos = 31 - bits_u32.leading_zeros();
println!("Sentinel position: bit {}", sentinel_pos);
println!("\n=== Initial State Reading ===");
let after_sentinel = bits_u32 & ((1 << sentinel_pos) - 1);
println!(
"After sentinel: {:0width$b}",
after_sentinel,
width = sentinel_pos as usize
);
let ll_bits = 6u32;
let ll_state = (after_sentinel >> (sentinel_pos - ll_bits)) & ((1 << ll_bits) - 1);
println!(
"LL initial state: {} (bits {}..{})",
ll_state,
sentinel_pos - 1,
sentinel_pos - ll_bits
);
let of_bits = 5u32;
let of_state = (after_sentinel >> (sentinel_pos - ll_bits - of_bits)) & ((1 << of_bits) - 1);
println!(
"OF initial state: {} (bits {}..{})",
of_state,
sentinel_pos - ll_bits - 1,
sentinel_pos - ll_bits - of_bits
);
let ml_bits = 6u32;
let ml_state =
(after_sentinel >> (sentinel_pos - ll_bits - of_bits - ml_bits)) & ((1 << ml_bits) - 1);
println!(
"ML initial state: {} (bits {}..{})",
ml_state,
sentinel_pos - ll_bits - of_bits - 1,
sentinel_pos - ll_bits - of_bits - ml_bits
);
println!("\n=== ML State Analysis ===");
let ml_table = haagenti_zstd::fse::FseTable::from_hardcoded_ml().unwrap();
for state in [ml_state, 42, 43, 44] {
let entry = ml_table.decode(state as usize);
println!(
"ML State {} -> symbol={}, seq_base={}, seq_extra_bits={}",
state, entry.symbol, entry.seq_base, entry.seq_extra_bits
);
}
println!("\n=== Expected Values ===");
println!("For match_length=496: need code 44 (baseline 259 + 8 extra bits)");
println!("Extra value: 496 - 259 = {}", 496 - 259);
println!("\n=== Extra Bits Analysis ===");
let remaining_bits = sentinel_pos - ll_bits - of_bits - ml_bits;
println!(
"Remaining bits after states: {} (bits 0..{})",
remaining_bits, remaining_bits
);
let extra_region = after_sentinel & ((1 << remaining_bits) - 1);
println!(
"Extra region value: {} = {:0width$b}",
extra_region,
extra_region,
width = remaining_bits as usize
);
println!("\nIf ML has 8 extra bits: extra = {}", extra_region & 0xFF);
}