6个版本

0.2.3 2019年7月8日
0.2.2 2019年7月5日
0.2.1 2019年5月28日
0.1.0 2019年5月19日
0.0.0 2019年5月14日

#2275 in 编码

Download history 341/week @ 2024-03-12 272/week @ 2024-03-19 143/week @ 2024-03-26 156/week @ 2024-04-02 149/week @ 2024-04-09 403/week @ 2024-04-16 176/week @ 2024-04-23 143/week @ 2024-04-30 176/week @ 2024-05-07 409/week @ 2024-05-14 492/week @ 2024-05-21 541/week @ 2024-05-28 399/week @ 2024-06-04 157/week @ 2024-06-11 161/week @ 2024-06-18 60/week @ 2024-06-25

850 monthly downloads
5 个crate中使用 (直接使用2个)

MIT/Apache

48KB
934

byteio

字节I/O抽象。
crate version (crates.io) build status (azure) docs (docs.rs) coverage (codecov.io)

关于

byteio 是一个简单的crate,它公开了对连续内存切片进行读写操作轻量级抽象。

在核心上,byteio 没有什么新的。它提供的许多功能在其他地方也可以找到,例如 std::iobyteorderbytes。它提供的是

  • 一流的 no_std 支持。
  • 与底层缓冲区寿命相关的读取。

该crate基于两个核心特质:ReadBytesWriteBytes。两个扩展特质还添加了读取和写入数字的功能,并为实现了核心特质的任何类型提供了泛型实现。

安装

要开始使用 byteio,请将其添加到您的 Cargo.toml,如下所示

[dependencies]
byteio = "0.2"

默认情况下,这将激活 std 功能,它启用了仅在用标准库编译时才可用的crate中的功能。

要在一个 no_std 环境中使用该crate,您只需禁用此功能。这可以通过调整您的 Cargo.toml 来完成

[dependencies]
byteio = { version = "0.2", default-features = false }

该crate还有一个最终功能:alloc。当您在一个 no_std 环境中构建,有一个分配器,并希望使用与 Vec<u8> 一起工作的功能时,应使用此功能。您可以通过再次调整您的 Cargo.toml 来激活此功能

[dependencies]
byteio = { version = "0.2", default-features = false, features = ["alloc"] }

用法

手动序列化和反序列化一个简单的网络数据包

use std::convert::TryInto;

use byteio::prelude::*; // ReadBytes, ReadBytesExt, WriteBytes, WriteBytesExt

/// A packet whose payload is encoded as `[n_msb, n_lsb, b_0, b_1, ..., b_n-1]`.
struct Packet<'a> {
   payload: &'a [u8],
}

impl<'a> Packet<'a> {
    fn decode<R: ReadBytes<'a>>(mut reader: R) -> byteio::Result<Self> {
        let len: usize = reader.try_read_u16_be()?.into();
        let payload = reader.try_read_exact(len)?;

        Ok(Self { payload })
    }

    fn encode<W: WriteBytes>(&self, mut writer: W) -> byteio::Result<()> {
        let len: u16 = self.payload.len().try_into().unwrap_or_else(|_| !0);

        writer.try_write_u16_be(len)?;
        writer.try_write_exact(&self.payload[..usize::from(len)])?;

        Ok(())
    }
}

fn main() -> byteio::Result<()> {
    let data = b"\x00\x0Chello, world";

    let packet = Packet::decode(&data[..])?;
    assert_eq!(packet.payload, b"hello, world");

    let mut buf = Vec::new();
    packet.encode(&mut buf)?;
    assert_eq!(&*buf, data);

    Ok(())
}

许可

该项目受以下任一协议的双重许可

由您选择。

贡献

如果您想为byteio做出贡献,遇到任何问题,或者甚至有您希望实现的功能,欢迎提交新问题和拉取请求。

除非您明确表示否则,您提交给byteio的任何有意贡献,根据Apache-2.0许可证定义,应如上双授权,不附加任何额外条款或条件。

无运行时依赖