A child indirect block in row r of a fractal heap's doubling table spans that row's block size of heap space, so it has log2(size) - log2(start_block_size * width) + 1 rows (libhdf5's H5HF__dtable_size_to_rows). The reader used row - first_indirect_row + 1, which undercounts, so every object stored past the root block's direct rows (512 KiB with libhdf5's defaults) was unreachable: dense groups with a few thousand long link names, or ~20 000 short ones, could not be listed. Regression test: dense_group_whose_heap_outgrows_the_root_direct_rows (h5py writes 2 500 links with 248-byte names; listing compared with h5py). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
clawhdf5-format
Pure-Rust HDF5 binary format parsing and writing — no C dependencies.
Features
- Zero-copy superblock, object header, and B-tree parsing
- Chunked dataset read/write with filter pipelines
no_stdsupport (disablestdfeature)- Optional parallel reads via Rayon
- SHA-256 provenance tracking
Usage
use clawhdf5_format::Superblock;
let data = std::fs::read("data.h5").unwrap();
let sb = Superblock::from_bytes(&data).unwrap();
println!("HDF5 version {}.{}", sb.version_major(), sb.version_minor());
License
MIT