#byte #byte-slice #binary-parser #parser #wrapper #binary-data #原始类型

bytes_parser

一个简单的包装器,用于从字节数组中解析原始Rust类型

6个版本

0.1.5 2024年5月20日
0.1.4 2023年3月13日
0.1.3 2023年1月15日

#837编码

每月 45次下载
2 个crates中使用 (via konsumer_offsets)

MIT/Apache

33KB
425

bytes_parser CI_s Doc_s Ver_s Down_s Lic_s

一个简单的包装器,用于从字节数组中解析原始Rust类型 [u8]


它是用来做什么的?

如果你只需要解析一个定制的二进制协议,那么这个crate就是为你准备的。你提供一个字节的引用切片,并且假设你知道这些字节代表什么,从中读取原始值。

这个crate的核心是 BytesParser,它遵循了一些原则

  • 简单性:仅仅是一个字节数组的薄包装,带有游标来跟踪进度。
  • 零拷贝:返回的要么是位复制的原始类型,要么是原始字节的引用——从不克隆。
  • 仅原始类型:如果你需要序列化/反序列化复杂的数据结构,你可能需要 serde

特性

  • 解析所有原始 标量类型,有符号和无符号,以及 &str&[u8] 的子切片。
  • 内部、自动更新的游标,以实现简单的扫描逻辑。
  • 可以选择将游标任意、安全地沿输入切片移动。
  • 支持端序选择(参见 ParsingEndian)。
  • 描述性错误(参见 BytesParserError)。
  • 最小依赖。

示例

use bytes_parser::{BytesParser, ParsingEndian};

let input: &[u8] = /* a slice of bytes from somewhere */;

// Crate a parser from a given slice of bytes
let mut parser = BytesParser::from(input);

// Will use Big-Endian parsing
assert_eq!(parser.endian(), ParsingEndian::BE);
assert_eq!(ParsingEndian::BE, ParsingEndian::default());

// Parse a string length and the string itself
let str_len = parser.parse_usize()?;
let str = parser.parse_str_utf8(str_len)?;
assert_eq!(str, "Forza Napoli Sempre!");

替代方案

  • nom:学习曲线更陡峭,但功能更全面。
  • serde:主要关注知名格式的序列化和反序列化,但可以设置为处理字节数组。

许可证

根据以下任一许可证授权

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的任何贡献,均应双重许可,如上所述,不附加任何额外条款或条件。

依赖

~275–730KB
~17K SLoC