qubit-codec-binary

Buffer-oriented binary codecs for Rust

Rust CI Coverage Crates.io Rust License

面向 Rust 的缓冲区级 binary codec。

概述

Qubit Binary Codec 提供基于调用方管理 byte buffer 的低层 binary codec。它不依赖 std::io;面向 stream 的 reader/writer adapter 位于 qubit-io-binary

本库提供:

设计目标

特性

Fixed-Width Binary Scalar

LEB128 值

ZigZag 值

聚焦的公开 API

文档

安装

Cargo.toml 中添加:

[dependencies]
qubit-codec-binary = "0.1"

快速开始

use qubit_codec_binary::{
    BigEndian,
    BinaryCodec,
    Leb128Codec,
    NonStrict,
};

let mut fixed = [0_u8; BinaryCodec::<u32, BigEndian>::MAX_UNITS_PER_VALUE];
unsafe {
    BinaryCodec::<u32, BigEndian>::encode_unchecked(0x0102_0304, &mut fixed, 0);
}
assert_eq!([1, 2, 3, 4], fixed);

let mut compact = [0_u8; Leb128Codec::<u64, NonStrict>::MAX_UNITS_PER_VALUE];
let written = unsafe { Leb128Codec::<u64, NonStrict>::encode_unchecked(300, &mut compact, 0) };
assert_eq!(2, written);

Unchecked API 契约

底层 codec 方法刻意设计为 unsafe。调用方必须先验证 buffer 边界:

上层代码应先完成这些边界检查,再把 unsafe 调用封装到安全 API 中。owned-value adapter 和 buffered engine 请直接从 qubit-codec 引入;本 crate 不重导出通用 codec adapter。binary codec 示例见用户指南

API 参考

BinaryCodec 操作

条目描述
Codec (Unit = u8)通过 core trait 解码和编码一个 fixed-width scalar
MIN_UNITS_PER_VALUE当前标量类型所需的最少字节数
MAX_UNITS_PER_VALUE当前标量类型所需的最多字节数
decode_unchecked(input, index)无边界检查解码一个 fixed-width scalar
encode_unchecked(value, output, index)无边界检查编码一个 fixed-width scalar

Leb128Codec 操作

条目描述
Codec (Unit = u8)通过 core trait 解码和编码一个 LEB128 值
MIN_UNITS_PER_VALUE可能构成完整值的最少可读字节数
MAX_UNITS_PER_VALUE当前整数类型最多需要的字节数
decode_unchecked(input, index)解码一个完整 LEB128 值
encode_unchecked(value, output, index)编码一个 canonical LEB128 值

ZigZagCodec 操作

条目描述
Codec (Unit = u8)通过 core trait 解码和编码一个 ZigZag LEB128 值
MIN_UNITS_PER_VALUE可能构成完整值的最少可读字节数
MAX_UNITS_PER_VALUE当前 signed integer 类型最多需要的字节数
decode_unchecked(input, index)解码 ZigZag over unsigned LEB128
encode_unchecked(value, output, index)把 signed integer 编码为 ZigZag + unsigned LEB128

LEB128 Decode Policy

Policy含义
Strict拒绝非 canonical LEB128 编码
NonStrict在 decoded value 可表达时接受兼容编码
Leb128DecodePolicysealed policy trait,由内置 policy marker 实现

库边界

qubit-codec-binary 只包含缓冲区级 binary codec。共享 core trait 使用 qubit-codec,通用 std::io helper 使用 qubit-io,面向 stream 的 binary reader/writer 使用 qubit-io-binary

性能考虑

BinaryCodecLeb128CodecZigZagCodec 都是零大小 codec 类型,不产生运行时分配。它们的 unchecked 方法和 Codec 实现(Unit = u8)面向已经验证缓冲区容量的热路径,或被 buffered stream adapter 在内部使用。

测试与代码覆盖率

本项目通过 tests/ 下的集成测试覆盖二进制线格式行为。

运行测试

# 运行所有测试
cargo test

# 运行覆盖率报告
./coverage.sh

# 生成文本格式报告
./coverage.sh text

# 对齐 CI 要求
./align-ci.sh

# 运行 CI 检查(格式化、clippy、测试、覆盖率、安全审计)
RS_CI_SKIP_TOOLCHAIN_UPDATE=1 ./ci-check.sh

依赖项

运行时依赖保持很少:

许可证

Copyright (c) 2026. Haixing Hu.

根据 Apache 许可证 2.0 版("许可证")授权;除非遵守许可证,否则您不得使用此文件。您可以在以下位置获取许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则根据许可证分发的软件按"原样"分发,不附带任何明示或暗示的担保或条件。有关许可证下的特定语言管理权限和限制,请参阅许可证。

完整的许可证文本请参阅 LICENSE

贡献

欢迎贡献!请随时提交 Pull Request。

开发指南

作者

胡海星

相关项目

---

仓库地址:https://github.com/qubit-ltd/rs-codec-binary