#endian #binary #tokio #async #future #async-io

无std bitendian

一个支持异步的、用于大端和小端读取/写入数字的易用库

2个不稳定版本

0.2.0 2023年11月7日
0.1.0 2023年11月7日

#1708 in 编码

MIT/Apache

31KB
518

为在大小端之间进行数字编码和解码提供了便利方法。

原始整数实现了 BitEndian

use bitendian::BitEndian;

let it: u16 = 256;
assert_eq!(BitEndian::to_be_bytes(it), [1, 0]);
assert_eq!(BitEndian::to_le_bytes(it), [0, 1]);

扩展方法提供了便利的读取器和写入器。

use bitendian::{io::WriteExt as _, tokio::AsyncReadExt as _};

let mut buf = vec![];
buf.write_be(1u16)?;
let swapped = buf.as_slice().read_le().await?;
assert_eq!(256u16, swapped);

byteorder 进行比较。

  • 该crate利用类型推断来避免定义大量的例如 write_uXX 方法。
    use byteorder::{ReadBytesExt as _, BE, LE};
    use bitendian::io::ReadExt as _;
    use std::io;
    
    fn read_header(mut r: impl io::Read) -> io::Result<Header> {
        // before...
        Ok(Header {
            count: r.read_u16::<BE>()?,
                       // ^ this can be inferred
            offset: r.read_i32::<LE>()?
                              // ^ this could be a plain method
        })
        // after
        Ok(Header {
            count: r.read_be()?,
            offset: r.read_le()?,
        })
    }
    
  • 该crate支持运行时端序。
  • 该crate分别通过 futurestokio 功能支持 futures::iotokio::io
  • 该crate仅支持Rust的内置类型,例如不支持 u24
  • 两个crate都通过禁用默认的 std 功能来支持 #![no_std]

依赖项

~0–1.3MB
~22K SLoC