This is a fork of the [lebe](https://crates.io/crates/lebe) crate. The git repository is located at https://github.com/johannesvollmer/lebe.

[![Rust Docs](https://docs.rs/ai-lebe/badge.svg)](https://docs.rs/ai-lebe)
[![Crate Crate](https://img.shields.io/crates/v/ai-lebe.svg)](https://crates.io/crates/ai-lebe)
![Lines of Code](https://tokei.rs/b1/github/atom-planet-embrace/ai-lebe?category=code)


# LEBE
Tiny, dead simple, high performance endianness conversions with a generic API.
This crate purposefully does not have a different method, like `write_u16(my_value)`, for each primitive type. Instead, this uses generic type inference: `write(my_u16)`.

# Purpose
This crate has exactly two purposes:
  1. Simple conversion between slices of primitives and byte arrays without unsafe code
  2. Simple and fast conversion from one endianness to the other one

The [byteorder crate](https://github.com/BurntSushi/byteorder) uses ![Lines of Code](https://tokei.rs/b1/github/BurntSushi/byteorder?category=code) for this.

This simplifies reading and writing binary data to files or network streams.


# Usage

Write values.
```rust
    use ai_lebe::io::WriteEndian;
    use std::io::Write;

    fn main(){
        let mut output_bytes: Vec<u8> = Vec::new();

        let numbers: &[i32] = &[ 32, 102, 420, 594 ];
        output_bytes.write_as_little_endian(numbers.len()).unwrap();
        output_bytes.write_as_little_endian(numbers).unwrap();
    }
```

Read numbers.
```rust
    use ai_lebe::io::ReadEndian;
    use std::io::Read;

    fn main(){
        let mut input_bytes: &[u8] = &[ 3, 244 ];
        let number: u16 = input_bytes.read_from_little_endian().unwrap();
    }
```

Read slices.
```rust
    use ai_lebe::io::ReadEndian;
    use std::io::Read;

    fn main(){
        let mut input_bytes: &[u8] = &[ 0, 2, 0, 3, 244, 1, 0, 3, 244, 1 ];

        let len: u16 = input_bytes.read_from_little_endian().unwrap();
        let mut numbers = vec![ 0.0; len as usize ];

        input_bytes.read_from_little_endian_into(numbers.as_mut_slice()).unwrap();
    }
```

Convert slices in-place.
```rust
    use ai_lebe::Endian;

    fn main(){
        let mut numbers: &[i32] = &[ 32, 102, 420, 594 ];
        numbers.convert_current_to_little_endian();
    }
```


# Why not use [byteorder](https://crates.io/crates/byteorder)?
This crate supports batch-writing slices with native speed
where the os has the matching endianness. Writing slices in `byteorder`
must be done manually, and may be slower than expected.
This crate does provide u8 and i8 slice operations for completeness.
Also, the API of this crate looks simpler.

# Why not use [endianness](https://crates.io/crates/endianness)?
This crate has no runtime costs, just as `byteorder`.

# Why not use this crate?
The other crates probably have better documentation.


# Fun Facts
LEBE is made up from 'le' for little endian and 'be' for big endian.
If you say that word using english pronounciation,
a german might think you said the german word for 'love'.
