Skip to content

Latest commit

 

History

History
59 lines (50 loc) · 1.95 KB

README.md

File metadata and controls

59 lines (50 loc) · 1.95 KB

Convenience methods for encoding and decoding numbers in either big-endian or little-endian.

Primitive integers implement 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]);

Extension methods provide convenient readers and writers.

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);

Comparison with byteorder.

  • This crate leverages type inference to avoid defining dozens of e.g write_uXX methods.
    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()?,
        })
    }
  • This crate supports run-time endianness.
  • This crate supports futures::io and tokio::io via the futures and tokio features respectively.
  • This crate only supports rust's built-in types, not, eg. u24.
  • Both crates support #![no_std] by disabling the default std feature.