#little-endian #endianness #big-endian #byte #async-io #binary

no-std byteorder_async

异步读取/写入大端和小端格式的数字的库

4个稳定版本

1.2.0 2020年4月25日
1.1.0 2020年4月24日
1.0.1 2020年4月22日

#1593 in 编码

Download history 1/week @ 2023-12-18 1/week @ 2023-12-25 4/week @ 2024-01-08 5/week @ 2024-02-12 17/week @ 2024-02-19 43/week @ 2024-02-26 19/week @ 2024-03-04 23/week @ 2024-03-11 15/week @ 2024-03-18

每月下载量101
用于 5 个crate (3 个直接使用)

Unlicense OR MIT

225KB
3.5K SLoC

byteorder - async

这是对byteorder的分支,增加了以下功能:

  • 使用现代Rust的try (? 而不是try!)
  • 支持 tokio::io
  • 支持 futures::io

安装

for futures::io

byteorder_async = {version="1.2.0", features=["futures_async"] }

for tokio::io

byteorder_async = {version="1.2.0", features=["tokio_async"] }

基本异步使用

use byteorder_async::ReaderToByteOrder;

let reader : io::AsyncRead = ...;
// after the byte_order its the same calls.
let byte = reader.byte_order().read_u8().await;

注意:调用 byte_order() 的原因是 trait 中尚未支持 async fn。


lib.rs:

此crate提供了对大端或小端顺序编码和解码数字的便利方法。

crate的结构相当简单。一个 trait,ByteOrder,指定了 Rust 中每种数字类型的字节转换方法(不包括像 usizeisize 这样具有平台相关大小的数字)。两种类型,BigEndianLittleEndian 实现了这些方法。最后,ReadBytesExtWriteBytesExt 为实现了 ReadWrite 的所有类型提供了便利方法。

提供了一个别名,NetworkEndian,用于表示BigEndian,以帮助提高代码的可读性。

还提供了一个额外的别名,NativeEndian,用于表示本地平台的字节序。这在需要序列化数据使用时而不需要转换时很方便。

示例

Read类型中读取无符号16位大端整数

use std::io::Cursor;
use byteorder::{BigEndian, ReadBytesExt};

let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
// Note that we use type parameters to indicate which kind of byte order
// we want!
assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());

将无符号16位小端整数写入Write类型

use byteorder::{LittleEndian, WriteBytesExt};

let mut wtr = vec![];
wtr.write_u16::<LittleEndian>(517).unwrap();
wtr.write_u16::<LittleEndian>(768).unwrap();
assert_eq!(wtr, vec![5, 2, 0, 3]);

可选功能

当启用i128功能时,此crate可选地提供对128位值(i128u128)的支持。

此crate也可以在不使用标准库的情况下使用。

替代方案

请注意,从Rust 1.32开始,标准数字类型提供了内置方法,如to_le_bytesfrom_le_bytes,这些方法支持一些相同的用例。

依赖项

~0–1MB
~14K SLoC