#byte #endian #macro-derive #no-std

no-std endian_codec

以特定顺序将 Rust 类型编码/解码为打包的字节

2 个版本

0.1.1 2020 年 2 月 8 日
0.1.0 2020 年 2 月 1 日

解析器实现 中排名 2196

Download history 21/week @ 2024-04-07 21/week @ 2024-04-14 23/week @ 2024-04-21 23/week @ 2024-04-28 61/week @ 2024-05-05 33/week @ 2024-05-12 81/week @ 2024-05-19 102/week @ 2024-05-26 81/week @ 2024-06-02 54/week @ 2024-06-09 70/week @ 2024-06-16 62/week @ 2024-06-23 38/week @ 2024-06-30 20/week @ 2024-07-07 43/week @ 2024-07-14 29/week @ 2024-07-21

每月下载 135

Apache-2.0 OR MIT

26KB
374

crates.io 文档 CI master 维护 derive: crates.io

endian_codec

这个包帮助将类型序列化为字节,并从字节反序列化,具有特殊的字节序。此包可以在 no_std 环境中使用,且没有外部依赖。

如果你正在寻找一个小的通用二进制(反)序列化器,它可以与 serde 一起使用,请查看 bincode

主要功能

  • 将结构体转换为端序并返回的干净方式
  • 派生
  • no_std 和无外部依赖

示例

use endian_codec::{PackedSize, EncodeLE, DecodeLE};
// If you look at this structure without checking the documentation, you know it works with
// little-endian notation
#[derive(Debug, PartialEq, Eq, PackedSize, EncodeLE, DecodeLE)]
struct Version {
  major: u16,
  minor: u16,
  patch: u16
}

let mut buf = [0; Version::PACKED_LEN]; // From PackedSize
let test = Version { major: 0, minor: 21, patch: 37 };
// if you work with big- and little-endians, you will not mix them accidentally
test.encode_as_le_bytes(&mut buf);
let test_from_b = Version::decode_from_le_bytes(&buf);
assert_eq!(test, test_from_b);

也可能存在这样的情况:你必须在一个结构体中处理混合端序。

use endian_codec::{PackedSize, EncodeME};
// even if you only use derive EncodeME, you also need to have required traits in the scope.
use endian_codec::{EncodeLE, EncodeBE}; // for #[endian = "le/be"]

#[derive(PackedSize, EncodeME)]
// You work with a very old system and there are mixed-endians
// There will be only one format "le" or "little" in the next minor version.
struct Request {
  #[endian = "le"]
  cmd: u16,
  #[endian = "little"] // or #[endian = "le"]
  value: i64,
  #[endian = "big"] // or #[endian = "be"]
  timestamp: i128,
}

let mut buf = [0; Request::PACKED_LEN];
let req = Request {
  cmd: 0x44,
  value: 74,
  timestamp: 0xFFFF_FFFF_0000_0000,
};
// here we see me (mixed-endian), just look at the struct definition for details
req.encode_as_me_bytes(&mut buf);

为什么还需要另一个处理端序的 crate?

  • 轻松地对具有多个字段的结构体进行字节序编码,并保持编码的一致性
  • 学习如何创建自定义派生
  • 创建更干净的 API

还有其他一些处理端序的 crate

  • byteorder - 用于读取/写入大端和小端数字的库。
  • bytes - Buf 和 BufMut 特性,具有将原语放入和从所需端序格式获取的方法。
  • simple_endian - 而不是提供转换函数,创建存储变量在所需端序格式中的类型。
  • struct_deser - 这个 crate 的灵感来源 - 但以更干净和 Rust 的方式。

许可协议

根据以下任一项许可

由您选择。

贡献

除非您明确说明,否则根据Apache-2.0许可证的定义,您提交的任何有意包含在工作中的贡献,应如上双许可,不附加任何额外条款或条件。

此项目试图遵循以下规则

此README由cargo-readme模板生成

依赖关系

约215KB