#binary #decode #text #alignment #binary-data #encode-decode #simd

bintext

使用 SIMD 编码和解码二进制编码的文本为对齐的二进制数据块

3 个版本

0.1.3 2020年8月23日
0.1.2 2020年8月23日
0.1.1 2020年8月23日
0.1.0 2020年8月23日

#2290 in 编码

MIT 许可协议

33KB
596

Bin Text

使用 SIMD 编码和解码二进制编码的文本为对齐的二进制数据块

https://github.com/lassade/bintext/blob/main/.github/workflows/rust.yml

支持 SIMD(AVX2 和 SSSE3)的快速二进制文本编码和解码,具有良好的回退性能。

这个 crate 的主要思想是提供文本格式的零拷贝二进制反序列化。

工作原理

文本格式无法保证对齐,因此无论数据如何,在解码时都需要重新对齐,如果所需的对齐是 N,则最大偏移量需要移动的字节数小于 N。因此,通过在二进制编码的文本中提供 N - 1 的起始填充,可以实现对齐到 N

快速说明 此 crate 只接受等于或大于 N 的填充,因为这做起来比较便宜。

// Padding of 8 (suppose it was read form a file)
let hex = "--------a1f7d5e8d14f0f76".to_string();

unsafe {
    // Decode with padding of 8 and alignment of 8
    let slice = bintext::hex::decode_aligned(&mut hex, 8, 8).unwrap();
    // Data is aligned so you can safely do this:
    let slice: &[u64] = std::slice::from_raw_parts(
        slice.as_ptr() as *const _,
        slice.len() / std::mem::size_of::<u64>()
    );
}

待办事项

  • NEON 指令集
  • Base64

其他类似 crate

有许多其他 crate 已经完成了这项工作,但每个都存在某种性能上的不足。

  • hex 性能较差,但代码体积较小,因为它不依赖于查找表(LUTs);
  • base16,没有 SIMD,但解码更快,整体编码性能良好;
  • faster-hex 使用 SSSE3 和 AVX2 进行快速编码,解码只使用 AVX2。SSE 是所有指令集中 SIMD 覆盖面最好的,因此应该是一个必须的选项。

此 crate 提供了覆盖所有竞争对手性能弱点的实现。只需运行 cargo bench

所有这些 crate 都没有提供解码对齐数据的函数,因此在解码后需要额外的对齐步骤。

无运行时依赖项