#base64 #base32 #hex #no_std

no-std data-encoding

Efficient and customizable data-encoding functions

10 stable releases

✓ Uses Rust 2018 edition

2.2.0 Feb 22, 2020
2.1.2 Dec 29, 2018
2.1.1 Feb 4, 2018
2.1.0 Nov 18, 2017
1.1.1 Dec 12, 2015

#15 in Encoding

Download history 19185/week @ 2019-12-15 8447/week @ 2019-12-22 11925/week @ 2019-12-29 17831/week @ 2020-01-05 20473/week @ 2020-01-12 20974/week @ 2020-01-19 21619/week @ 2020-01-26 20867/week @ 2020-02-02 21110/week @ 2020-02-09 19906/week @ 2020-02-16 23199/week @ 2020-02-23 26633/week @ 2020-03-01 27626/week @ 2020-03-08 26001/week @ 2020-03-15 26949/week @ 2020-03-22 30255/week @ 2020-03-29

78,705 downloads per month
Used in 397 crates (112 directly)

MIT license

115KB
1.5K SLoC

Common use-cases

This library provides the following common encodings:

  • HEXLOWER: lowercase hexadecimal
  • HEXLOWER_PERMISSIVE: lowercase hexadecimal with case-insensitive decoding
  • HEXUPPER: uppercase hexadecimal
  • HEXUPPER_PERMISSIVE: uppercase hexadecimal with case-insensitive decoding
  • BASE32: RFC4648 base32
  • BASE32_NOPAD: RFC4648 base32 without padding
  • BASE32_DNSSEC: RFC5155 base32
  • BASE32_DNSCURVE: DNSCurve base32
  • BASE32HEX: RFC4648 base32hex
  • BASE32HEX_NOPAD: RFC4648 base32hex without padding
  • BASE64: RFC4648 base64
  • BASE64_NOPAD: RFC4648 base64 without padding
  • BASE64_MIME: RFC2045-like base64
  • BASE64URL: RFC4648 base64url
  • BASE64URL_NOPAD: RFC4648 base64url without padding

Typical usage looks like:

// allocating functions
BASE64.encode(&input_to_encode)
HEXLOWER.decode(&input_to_decode)
// in-place functions
BASE32.encode_mut(&input_to_encode, &mut encoded_output)
BASE64_URL.decode_mut(&input_to_decode, &mut decoded_output)

See the documentation or the changelog for more details.

Custom use-cases

This library also provides the possibility to define custom little-endian ASCII base-conversion encodings for bases of size 2, 4, 8, 16, 32, and 64 (for which all above use-cases are particular instances). It supports:

  • padded and unpadded encodings
  • canonical encodings (e.g. trailing bits are checked)
  • in-place encoding and decoding functions
  • partial decoding functions (e.g. for error recovery)
  • character translation (e.g. for case-insensitivity)
  • most and least significant bit-order
  • ignoring characters when decoding (e.g. for skipping newlines)
  • wrapping the output when encoding

The typical definition of a custom encoding looks like:

lazy_static! {
    static ref HEX: Encoding = {
        let mut spec = Specification::new();
        spec.symbols.push_str("0123456789abcdef");
        spec.translate.from.push_str("ABCDEF");
        spec.translate.to.push_str("abcdef");
        spec.encoding().unwrap()
    };
    static ref BASE64: Encoding = {
        let mut spec = Specification::new();
        spec.symbols.push_str(
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
        spec.padding = Some('=');
        spec.encoding().unwrap()
    };
}

You may also use the macro library to define a compile-time custom encoding:

const HEX: Encoding = new_encoding!{
    symbols: "0123456789abcdef",
    translate_from: "ABCDEF",
    translate_to: "abcdef",
};
const BASE64: Encoding = new_encoding!{
    symbols: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    padding: '=',
};

See the documentation or the changelog for more details.

Performance

The performance of the encoding and decoding functions (for both common and custom encodings) are similar to existing implementations in C, Rust, and other high-performance languages (see how to run the benchmarks on github).

Swiss-knife binary

This crate is a library. If you are looking for the binary using this library, see the installation instructions on github.

No runtime deps