data_encoding/
lib.rs

1//! Efficient and customizable data-encoding functions like base64, base32, and hex
2//!
3//! This [crate] provides little-endian ASCII base-conversion encodings for
4//! bases of size 2, 4, 8, 16, 32, and 64. It supports:
5//!
6//! - [padding] for streaming
7//! - canonical encodings (e.g. [trailing bits] are checked)
8//! - in-place [encoding] and [decoding] functions
9//! - partial [decoding] functions (e.g. for error recovery)
10//! - character [translation] (e.g. for case-insensitivity)
11//! - most and least significant [bit-order]
12//! - [ignoring] characters when decoding (e.g. for skipping newlines)
13//! - [wrapping] the output when encoding
14//! - no-std environments with `default-features = false, features = ["alloc"]`
15//! - no-alloc environments with `default-features = false`
16//!
17//! You may use the [binary] or the [website] to play around.
18//!
19//! # Examples
20//!
21//! This crate provides predefined encodings as [constants]. These constants are of type
22//! [`Encoding`]. This type provides encoding and decoding functions with in-place or allocating
23//! variants. Here is an example using the allocating encoding function of [`BASE64`]:
24//!
25//! ```rust
26//! use data_encoding::BASE64;
27//! assert_eq!(BASE64.encode(b"Hello world"), "SGVsbG8gd29ybGQ=");
28//! ```
29//!
30//! Here is an example using the in-place decoding function of [`BASE32`]:
31//!
32//! ```rust
33//! use data_encoding::BASE32;
34//! let input = b"JBSWY3DPEB3W64TMMQ======";
35//! let mut output = vec![0; BASE32.decode_len(input.len()).unwrap()];
36//! let len = BASE32.decode_mut(input, &mut output).unwrap();
37//! assert_eq!(&output[0 .. len], b"Hello world");
38//! ```
39//!
40//! You are not limited to the predefined encodings. You may define your own encodings (with the
41//! same correctness and performance properties as the predefined ones) using the [`Specification`]
42//! type:
43//!
44//! ```rust
45//! use data_encoding::Specification;
46//! let hex = {
47//!     let mut spec = Specification::new();
48//!     spec.symbols.push_str("0123456789abcdef");
49//!     spec.encoding().unwrap()
50//! };
51//! assert_eq!(hex.encode(b"hello"), "68656c6c6f");
52//! ```
53//!
54//! You may use the [macro] library to define a compile-time custom encoding:
55//!
56//! ```rust,ignore
57//! use data_encoding::Encoding;
58//! use data_encoding_macro::new_encoding;
59//! const HEX: Encoding = new_encoding!{
60//!     symbols: "0123456789abcdef",
61//!     translate_from: "ABCDEF",
62//!     translate_to: "abcdef",
63//! };
64//! const BASE64: Encoding = new_encoding!{
65//!     symbols: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
66//!     padding: '=',
67//! };
68//! ```
69//!
70//! # Properties
71//!
72//! The [`HEXUPPER`], [`BASE32`], [`BASE32HEX`], [`BASE64`], and [`BASE64URL`] predefined encodings
73//! conform to [RFC4648].
74//!
75//! In general, the encoding and decoding functions satisfy the following properties:
76//!
77//! - They are deterministic: their output only depends on their input
78//! - They have no side-effects: they do not modify any hidden mutable state
79//! - They are correct: encoding followed by decoding gives the initial data
80//! - They are canonical (unless [`is_canonical`] returns false): decoding followed by encoding
81//!   gives the initial data
82//!
83//! This last property is usually not satisfied by base64 implementations. This is a matter of
84//! choice and this crate has made the choice to let the user choose. Support for canonical encoding
85//! as described by the [RFC][canonical] is provided. But it is also possible to disable checking
86//! trailing bits, to add characters translation, to decode concatenated padded inputs, and to
87//! ignore some characters. Note that non-canonical encodings may be an attack vector as described
88//! in [Base64 Malleability in Practice](https://eprint.iacr.org/2022/361.pdf).
89//!
90//! Since the RFC specifies the encoding function on all inputs and the decoding function on all
91//! possible encoded outputs, the differences between implementations come from the decoding
92//! function which may be more or less permissive. In this crate, the decoding function of canonical
93//! encodings rejects all inputs that are not a possible output of the encoding function. Here are
94//! some concrete examples of decoding differences between this crate, the `base64` crate, and the
95//! `base64` GNU program:
96//!
97//! | Input      | `data-encoding` | `base64`  | GNU `base64`  |
98//! | ---------- | --------------- | --------- | ------------- |
99//! | `AAB=`     | `Trailing(2)`   | `Last(2)` | `\x00\x00`    |
100//! | `AA\nB=`   | `Length(4)`     | `Byte(2)` | `\x00\x00`    |
101//! | `AAB`      | `Length(0)`     | `Padding` | Invalid input |
102//! | `AAA`      | `Length(0)`     | `Padding` | Invalid input |
103//! | `A\rA\nB=` | `Length(4)`     | `Byte(1)` | Invalid input |
104//! | `-_\r\n`   | `Symbol(0)`     | `Byte(0)` | Invalid input |
105//! | `AA==AA==` | `[0, 0]`        | `Byte(2)` | `\x00\x00`    |
106//!
107//! We can summarize these discrepancies as follows:
108//!
109//! | Discrepancy                | `data-encoding` | `base64` | GNU `base64` |
110//! | -------------------------- | --------------- | -------- | ------------ |
111//! | Check trailing bits        | Yes             | Yes      | No           |
112//! | Ignored characters         | None            | None     | `\n`         |
113//! | Translated characters      | None            | None     | None         |
114//! | Check padding              | Yes             | No       | Yes          |
115//! | Support concatenated input | Yes             | No       | Yes          |
116//!
117//! This crate permits to disable checking trailing bits. It permits to ignore some characters. It
118//! permits to translate characters. It permits to use unpadded encodings. However, for padded
119//! encodings, support for concatenated inputs cannot be disabled. This is simply because it doesn't
120//! make sense to use padding if it is not to support concatenated inputs.
121//!
122//! [RFC4648]: https://tools.ietf.org/html/rfc4648
123//! [`BASE32HEX`]: constant.BASE32HEX.html
124//! [`BASE32`]: constant.BASE32.html
125//! [`BASE64URL`]: constant.BASE64URL.html
126//! [`BASE64`]: constant.BASE64.html
127//! [`Encoding`]: struct.Encoding.html
128//! [`HEXUPPER`]: constant.HEXUPPER.html
129//! [`Specification`]: struct.Specification.html
130//! [`is_canonical`]: struct.Encoding.html#method.is_canonical
131//! [binary]: https://crates.io/crates/data-encoding-bin
132//! [bit-order]: struct.Specification.html#structfield.bit_order
133//! [canonical]: https://tools.ietf.org/html/rfc4648#section-3.5
134//! [constants]: index.html#constants
135//! [crate]: https://crates.io/crates/data-encoding
136//! [decoding]: struct.Encoding.html#method.decode_mut
137//! [encoding]: struct.Encoding.html#method.encode_mut
138//! [ignoring]: struct.Specification.html#structfield.ignore
139//! [macro]: https://crates.io/crates/data-encoding-macro
140//! [padding]: struct.Specification.html#structfield.padding
141//! [trailing bits]: struct.Specification.html#structfield.check_trailing_bits
142//! [translation]: struct.Specification.html#structfield.translate
143//! [website]: https://data-encoding.rs
144//! [wrapping]: struct.Specification.html#structfield.wrap
145
146#![no_std]
147#![cfg_attr(docsrs, feature(doc_cfg))]
148
149#[cfg(feature = "alloc")]
150extern crate alloc;
151#[cfg(feature = "std")]
152extern crate std;
153
154#[cfg(feature = "alloc")]
155use alloc::borrow::{Cow, ToOwned};
156#[cfg(feature = "alloc")]
157use alloc::string::String;
158#[cfg(feature = "alloc")]
159use alloc::vec;
160#[cfg(feature = "alloc")]
161use alloc::vec::Vec;
162use core::convert::TryInto;
163use core::debug_assert as safety_assert;
164
165macro_rules! check {
166    ($e: expr, $c: expr) => {
167        if !$c {
168            return Err($e);
169        }
170    };
171}
172
173trait Static<T: Copy>: Copy {
174    fn val(self) -> T;
175}
176
177macro_rules! define {
178    ($name: ident: $type: ty = $val: expr) => {
179        #[derive(Copy, Clone)]
180        struct $name;
181        impl Static<$type> for $name {
182            fn val(self) -> $type {
183                $val
184            }
185        }
186    };
187}
188
189define!(Bf: bool = false);
190define!(Bt: bool = true);
191define!(N1: usize = 1);
192define!(N2: usize = 2);
193define!(N3: usize = 3);
194define!(N4: usize = 4);
195define!(N5: usize = 5);
196define!(N6: usize = 6);
197
198#[derive(Copy, Clone)]
199struct On;
200
201impl<T: Copy> Static<Option<T>> for On {
202    fn val(self) -> Option<T> {
203        None
204    }
205}
206
207#[derive(Copy, Clone)]
208struct Os<T>(T);
209
210impl<T: Copy> Static<Option<T>> for Os<T> {
211    fn val(self) -> Option<T> {
212        Some(self.0)
213    }
214}
215
216macro_rules! dispatch {
217    (let $var: ident: bool = $val: expr; $($body: tt)*) => {
218        if $val {
219            let $var = Bt; dispatch!($($body)*)
220        } else {
221            let $var = Bf; dispatch!($($body)*)
222        }
223    };
224    (let $var: ident: usize = $val: expr; $($body: tt)*) => {
225        match $val {
226            1 => { let $var = N1; dispatch!($($body)*) },
227            2 => { let $var = N2; dispatch!($($body)*) },
228            3 => { let $var = N3; dispatch!($($body)*) },
229            4 => { let $var = N4; dispatch!($($body)*) },
230            5 => { let $var = N5; dispatch!($($body)*) },
231            6 => { let $var = N6; dispatch!($($body)*) },
232            _ => panic!(),
233        }
234    };
235    (let $var: ident: Option<$type: ty> = $val: expr; $($body: tt)*) => {
236        match $val {
237            None => { let $var = On; dispatch!($($body)*) },
238            Some(x) => { let $var = Os(x); dispatch!($($body)*) },
239        }
240    };
241    ($body: expr) => { $body };
242}
243
244fn chunk_unchecked<T>(x: &[T], n: usize, i: usize) -> &[T] {
245    safety_assert!((i + 1) * n <= x.len());
246    // SAFETY: Ensured by correctness requirements (and asserted above).
247    unsafe { core::slice::from_raw_parts(x.as_ptr().add(n * i), n) }
248}
249
250fn chunk_mut_unchecked<T>(x: &mut [T], n: usize, i: usize) -> &mut [T] {
251    safety_assert!((i + 1) * n <= x.len());
252    // SAFETY: Ensured by correctness requirements (and asserted above).
253    unsafe { core::slice::from_raw_parts_mut(x.as_mut_ptr().add(n * i), n) }
254}
255
256fn div_ceil(x: usize, m: usize) -> usize {
257    (x + m - 1) / m
258}
259
260fn floor(x: usize, m: usize) -> usize {
261    x / m * m
262}
263
264#[inline]
265fn vectorize<F: FnMut(usize)>(n: usize, bs: usize, mut f: F) {
266    for k in 0 .. n / bs {
267        for i in k * bs .. (k + 1) * bs {
268            f(i);
269        }
270    }
271    for i in floor(n, bs) .. n {
272        f(i);
273    }
274}
275
276/// Decoding error kind
277#[derive(Debug, Copy, Clone, PartialEq, Eq)]
278pub enum DecodeKind {
279    /// Invalid length
280    Length,
281
282    /// Invalid symbol
283    Symbol,
284
285    /// Non-zero trailing bits
286    Trailing,
287
288    /// Invalid padding length
289    Padding,
290}
291
292impl core::fmt::Display for DecodeKind {
293    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
294        let description = match self {
295            DecodeKind::Length => "invalid length",
296            DecodeKind::Symbol => "invalid symbol",
297            DecodeKind::Trailing => "non-zero trailing bits",
298            DecodeKind::Padding => "invalid padding length",
299        };
300        write!(f, "{}", description)
301    }
302}
303
304/// Decoding error
305#[derive(Debug, Copy, Clone, PartialEq, Eq)]
306pub struct DecodeError {
307    /// Error position
308    ///
309    /// This position is always a valid input position and represents the first encountered error.
310    pub position: usize,
311
312    /// Error kind
313    pub kind: DecodeKind,
314}
315
316#[cfg(feature = "std")]
317impl std::error::Error for DecodeError {}
318
319impl core::fmt::Display for DecodeError {
320    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
321        write!(f, "{} at {}", self.kind, self.position)
322    }
323}
324
325/// Decoding error with partial result
326#[derive(Debug, Copy, Clone, PartialEq, Eq)]
327pub struct DecodePartial {
328    /// Number of bytes read from input
329    ///
330    /// This number does not exceed the error position: `read <= error.position`.
331    pub read: usize,
332
333    /// Number of bytes written to output
334    ///
335    /// This number does not exceed the decoded length: `written <= decode_len(read)`.
336    pub written: usize,
337
338    /// Decoding error
339    pub error: DecodeError,
340}
341
342const INVALID: u8 = 128;
343const IGNORE: u8 = 129;
344const PADDING: u8 = 130;
345
346fn order(msb: bool, n: usize, i: usize) -> usize {
347    if msb {
348        n - 1 - i
349    } else {
350        i
351    }
352}
353
354#[inline]
355fn enc(bit: usize) -> usize {
356    match bit {
357        1 | 2 | 4 => 1,
358        3 | 6 => 3,
359        5 => 5,
360        _ => unreachable!(),
361    }
362}
363
364#[inline]
365fn dec(bit: usize) -> usize {
366    enc(bit) * 8 / bit
367}
368
369fn encode_len<B: Static<usize>>(bit: B, len: usize) -> usize {
370    div_ceil(8 * len, bit.val())
371}
372
373fn encode_block<B: Static<usize>, M: Static<bool>>(
374    bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
375) {
376    debug_assert!(input.len() <= enc(bit.val()));
377    debug_assert_eq!(output.len(), encode_len(bit, input.len()));
378    let bit = bit.val();
379    let msb = msb.val();
380    let mut x = 0u64;
381    for (i, input) in input.iter().enumerate() {
382        x |= u64::from(*input) << (8 * order(msb, enc(bit), i));
383    }
384    for (i, output) in output.iter_mut().enumerate() {
385        let y = x >> (bit * order(msb, dec(bit), i));
386        *output = symbols[(y & 0xff) as usize];
387    }
388}
389
390fn encode_mut<B: Static<usize>, M: Static<bool>>(
391    bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
392) {
393    debug_assert_eq!(output.len(), encode_len(bit, input.len()));
394    let enc = enc(bit.val());
395    let dec = dec(bit.val());
396    let n = input.len() / enc;
397    let bs = match bit.val() {
398        5 => 2,
399        6 => 4,
400        _ => 1,
401    };
402    vectorize(n, bs, |i| {
403        let input = chunk_unchecked(input, enc, i);
404        let output = chunk_mut_unchecked(output, dec, i);
405        encode_block(bit, msb, symbols, input, output);
406    });
407    encode_block(bit, msb, symbols, &input[enc * n ..], &mut output[dec * n ..]);
408}
409
410// Fails if an input character does not translate to a symbol. The error is the
411// lowest index of such character. The output is not written to.
412fn decode_block<B: Static<usize>, M: Static<bool>>(
413    bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
414) -> Result<(), usize> {
415    debug_assert!(output.len() <= enc(bit.val()));
416    debug_assert_eq!(input.len(), encode_len(bit, output.len()));
417    let bit = bit.val();
418    let msb = msb.val();
419    let mut x = 0u64;
420    for j in 0 .. input.len() {
421        let y = values[input[j] as usize];
422        check!(j, y < 1 << bit);
423        x |= u64::from(y) << (bit * order(msb, dec(bit), j));
424    }
425    for (j, output) in output.iter_mut().enumerate() {
426        *output = ((x >> (8 * order(msb, enc(bit), j))) & 0xff) as u8;
427    }
428    Ok(())
429}
430
431// Fails if an input character does not translate to a symbol. The error `pos`
432// is the lowest index of such character. The output is valid up to `pos / dec *
433// enc` excluded.
434fn decode_mut<B: Static<usize>, M: Static<bool>>(
435    bit: B, msb: M, values: &[u8; 256], input: &[u8], output: &mut [u8],
436) -> Result<(), usize> {
437    debug_assert_eq!(input.len(), encode_len(bit, output.len()));
438    let enc = enc(bit.val());
439    let dec = dec(bit.val());
440    let n = input.len() / dec;
441    for i in 0 .. n {
442        let input = chunk_unchecked(input, dec, i);
443        let output = chunk_mut_unchecked(output, enc, i);
444        decode_block(bit, msb, values, input, output).map_err(|e| dec * i + e)?;
445    }
446    decode_block(bit, msb, values, &input[dec * n ..], &mut output[enc * n ..])
447        .map_err(|e| dec * n + e)
448}
449
450// Fails if there are non-zero trailing bits.
451fn check_trail<B: Static<usize>, M: Static<bool>>(
452    bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8],
453) -> Result<(), ()> {
454    if 8 % bit.val() == 0 || !ctb {
455        return Ok(());
456    }
457    let trail = bit.val() * input.len() % 8;
458    if trail == 0 {
459        return Ok(());
460    }
461    let mut mask = (1 << trail) - 1;
462    if !msb.val() {
463        mask <<= bit.val() - trail;
464    }
465    check!((), values[input[input.len() - 1] as usize] & mask == 0);
466    Ok(())
467}
468
469// Fails if the padding length is invalid. The error is the index of the first
470// padding character.
471fn check_pad<B: Static<usize>>(bit: B, values: &[u8; 256], input: &[u8]) -> Result<usize, usize> {
472    let bit = bit.val();
473    debug_assert_eq!(input.len(), dec(bit));
474    let is_pad = |x: &&u8| values[**x as usize] == PADDING;
475    let count = input.iter().rev().take_while(is_pad).count();
476    let len = input.len() - count;
477    check!(len, len > 0 && bit * len % 8 < bit);
478    Ok(len)
479}
480
481fn encode_base_len<B: Static<usize>>(bit: B, len: usize) -> usize {
482    encode_len(bit, len)
483}
484
485fn encode_base<B: Static<usize>, M: Static<bool>>(
486    bit: B, msb: M, symbols: &[u8; 256], input: &[u8], output: &mut [u8],
487) {
488    debug_assert_eq!(output.len(), encode_base_len(bit, input.len()));
489    encode_mut(bit, msb, symbols, input, output);
490}
491
492fn encode_pad_len<B: Static<usize>, P: Static<Option<u8>>>(bit: B, pad: P, len: usize) -> usize {
493    match pad.val() {
494        None => encode_base_len(bit, len),
495        Some(_) => div_ceil(len, enc(bit.val())) * dec(bit.val()),
496    }
497}
498
499fn encode_pad<B: Static<usize>, M: Static<bool>, P: Static<Option<u8>>>(
500    bit: B, msb: M, symbols: &[u8; 256], spad: P, input: &[u8], output: &mut [u8],
501) {
502    let pad = match spad.val() {
503        None => return encode_base(bit, msb, symbols, input, output),
504        Some(pad) => pad,
505    };
506    debug_assert_eq!(output.len(), encode_pad_len(bit, spad, input.len()));
507    let olen = encode_base_len(bit, input.len());
508    encode_base(bit, msb, symbols, input, &mut output[.. olen]);
509    for output in output.iter_mut().skip(olen) {
510        *output = pad;
511    }
512}
513
514fn encode_wrap_len<
515    'a,
516    B: Static<usize>,
517    P: Static<Option<u8>>,
518    W: Static<Option<(usize, &'a [u8])>>,
519>(
520    bit: B, pad: P, wrap: W, ilen: usize,
521) -> usize {
522    let olen = encode_pad_len(bit, pad, ilen);
523    match wrap.val() {
524        None => olen,
525        Some((col, end)) => olen + end.len() * div_ceil(olen, col),
526    }
527}
528
529fn encode_wrap_mut<
530    'a,
531    B: Static<usize>,
532    M: Static<bool>,
533    P: Static<Option<u8>>,
534    W: Static<Option<(usize, &'a [u8])>>,
535>(
536    bit: B, msb: M, symbols: &[u8; 256], pad: P, wrap: W, input: &[u8], output: &mut [u8],
537) {
538    let (col, end) = match wrap.val() {
539        None => return encode_pad(bit, msb, symbols, pad, input, output),
540        Some((col, end)) => (col, end),
541    };
542    debug_assert_eq!(output.len(), encode_wrap_len(bit, pad, wrap, input.len()));
543    debug_assert_eq!(col % dec(bit.val()), 0);
544    let col = col / dec(bit.val());
545    let enc = col * enc(bit.val());
546    let dec = col * dec(bit.val()) + end.len();
547    let olen = dec - end.len();
548    let n = input.len() / enc;
549    for i in 0 .. n {
550        let input = chunk_unchecked(input, enc, i);
551        let output = chunk_mut_unchecked(output, dec, i);
552        encode_base(bit, msb, symbols, input, &mut output[.. olen]);
553        output[olen ..].copy_from_slice(end);
554    }
555    if input.len() > enc * n {
556        let olen = dec * n + encode_pad_len(bit, pad, input.len() - enc * n);
557        encode_pad(bit, msb, symbols, pad, &input[enc * n ..], &mut output[dec * n .. olen]);
558        output[olen ..].copy_from_slice(end);
559    }
560}
561
562// Returns the longest valid input length and associated output length.
563fn decode_wrap_len<B: Static<usize>, P: Static<bool>>(
564    bit: B, pad: P, len: usize,
565) -> (usize, usize) {
566    let bit = bit.val();
567    if pad.val() {
568        (floor(len, dec(bit)), len / dec(bit) * enc(bit))
569    } else {
570        let trail = bit * len % 8;
571        (len - trail / bit, bit * len / 8)
572    }
573}
574
575// Fails with Length if length is invalid. The error is the largest valid
576// length.
577fn decode_pad_len<B: Static<usize>, P: Static<bool>>(
578    bit: B, pad: P, len: usize,
579) -> Result<usize, DecodeError> {
580    let (ilen, olen) = decode_wrap_len(bit, pad, len);
581    check!(DecodeError { position: ilen, kind: DecodeKind::Length }, ilen == len);
582    Ok(olen)
583}
584
585// Fails with Length if length is invalid. The error is the largest valid
586// length.
587fn decode_base_len<B: Static<usize>>(bit: B, len: usize) -> Result<usize, DecodeError> {
588    decode_pad_len(bit, Bf, len)
589}
590
591// Fails with Symbol if an input character does not translate to a symbol. The
592// error is the lowest index of such character.
593// Fails with Trailing if there are non-zero trailing bits.
594fn decode_base_mut<B: Static<usize>, M: Static<bool>>(
595    bit: B, msb: M, ctb: bool, values: &[u8; 256], input: &[u8], output: &mut [u8],
596) -> Result<usize, DecodePartial> {
597    debug_assert_eq!(Ok(output.len()), decode_base_len(bit, input.len()));
598    let fail = |pos, kind| DecodePartial {
599        read: pos / dec(bit.val()) * dec(bit.val()),
600        written: pos / dec(bit.val()) * enc(bit.val()),
601        error: DecodeError { position: pos, kind },
602    };
603    decode_mut(bit, msb, values, input, output).map_err(|pos| fail(pos, DecodeKind::Symbol))?;
604    check_trail(bit, msb, ctb, values, input)
605        .map_err(|()| fail(input.len() - 1, DecodeKind::Trailing))?;
606    Ok(output.len())
607}
608
609// Fails with Symbol if an input character does not translate to a symbol. The
610// error is the lowest index of such character.
611// Fails with Padding if some padding length is invalid. The error is the index
612// of the first padding character of the invalid padding.
613// Fails with Trailing if there are non-zero trailing bits.
614fn decode_pad_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
615    bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
616) -> Result<usize, DecodePartial> {
617    if !pad.val() {
618        return decode_base_mut(bit, msb, ctb, values, input, output);
619    }
620    debug_assert_eq!(Ok(output.len()), decode_pad_len(bit, pad, input.len()));
621    let enc = enc(bit.val());
622    let dec = dec(bit.val());
623    let mut inpos = 0;
624    let mut outpos = 0;
625    let mut outend = output.len();
626    while inpos < input.len() {
627        match decode_base_mut(
628            bit,
629            msb,
630            ctb,
631            values,
632            &input[inpos ..],
633            &mut output[outpos .. outend],
634        ) {
635            Ok(written) => {
636                if cfg!(debug_assertions) {
637                    inpos = input.len();
638                }
639                outpos += written;
640                break;
641            }
642            Err(partial) => {
643                inpos += partial.read;
644                outpos += partial.written;
645            }
646        }
647        let inlen =
648            check_pad(bit, values, &input[inpos .. inpos + dec]).map_err(|pos| DecodePartial {
649                read: inpos,
650                written: outpos,
651                error: DecodeError { position: inpos + pos, kind: DecodeKind::Padding },
652            })?;
653        let outlen = decode_base_len(bit, inlen).unwrap();
654        let written = decode_base_mut(
655            bit,
656            msb,
657            ctb,
658            values,
659            &input[inpos .. inpos + inlen],
660            &mut output[outpos .. outpos + outlen],
661        )
662        .map_err(|partial| {
663            debug_assert_eq!(partial.read, 0);
664            debug_assert_eq!(partial.written, 0);
665            DecodePartial {
666                read: inpos,
667                written: outpos,
668                error: DecodeError {
669                    position: inpos + partial.error.position,
670                    kind: partial.error.kind,
671                },
672            }
673        })?;
674        debug_assert_eq!(written, outlen);
675        inpos += dec;
676        outpos += outlen;
677        outend -= enc - outlen;
678    }
679    debug_assert_eq!(inpos, input.len());
680    debug_assert_eq!(outpos, outend);
681    Ok(outend)
682}
683
684fn skip_ignore(values: &[u8; 256], input: &[u8], mut inpos: usize) -> usize {
685    while inpos < input.len() && values[input[inpos] as usize] == IGNORE {
686        inpos += 1;
687    }
688    inpos
689}
690
691// Returns next input and output position.
692// Fails with Symbol if an input character does not translate to a symbol. The
693// error is the lowest index of such character.
694// Fails with Padding if some padding length is invalid. The error is the index
695// of the first padding character of the invalid padding.
696// Fails with Trailing if there are non-zero trailing bits.
697fn decode_wrap_block<B: Static<usize>, M: Static<bool>, P: Static<bool>>(
698    bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, input: &[u8], output: &mut [u8],
699) -> Result<(usize, usize), DecodeError> {
700    let dec = dec(bit.val());
701    let mut buf = [0u8; 8];
702    let mut shift = [0usize; 8];
703    let mut bufpos = 0;
704    let mut inpos = 0;
705    while bufpos < dec {
706        inpos = skip_ignore(values, input, inpos);
707        if inpos == input.len() {
708            break;
709        }
710        shift[bufpos] = inpos;
711        buf[bufpos] = input[inpos];
712        bufpos += 1;
713        inpos += 1;
714    }
715    let olen = decode_pad_len(bit, pad, bufpos).map_err(|mut e| {
716        e.position = shift[e.position];
717        e
718    })?;
719    let written = decode_pad_mut(bit, msb, ctb, values, pad, &buf[.. bufpos], &mut output[.. olen])
720        .map_err(|partial| {
721            debug_assert_eq!(partial.read, 0);
722            debug_assert_eq!(partial.written, 0);
723            DecodeError { position: shift[partial.error.position], kind: partial.error.kind }
724        })?;
725    Ok((inpos, written))
726}
727
728// Fails with Symbol if an input character does not translate to a symbol. The
729// error is the lowest index of such character.
730// Fails with Padding if some padding length is invalid. The error is the index
731// of the first padding character of the invalid padding.
732// Fails with Trailing if there are non-zero trailing bits.
733// Fails with Length if input length (without ignored characters) is invalid.
734#[allow(clippy::too_many_arguments)]
735fn decode_wrap_mut<B: Static<usize>, M: Static<bool>, P: Static<bool>, I: Static<bool>>(
736    bit: B, msb: M, ctb: bool, values: &[u8; 256], pad: P, has_ignore: I, input: &[u8],
737    output: &mut [u8],
738) -> Result<usize, DecodePartial> {
739    if !has_ignore.val() {
740        return decode_pad_mut(bit, msb, ctb, values, pad, input, output);
741    }
742    debug_assert_eq!(output.len(), decode_wrap_len(bit, pad, input.len()).1);
743    let mut inpos = 0;
744    let mut outpos = 0;
745    while inpos < input.len() {
746        let (inlen, outlen) = decode_wrap_len(bit, pad, input.len() - inpos);
747        match decode_pad_mut(
748            bit,
749            msb,
750            ctb,
751            values,
752            pad,
753            &input[inpos .. inpos + inlen],
754            &mut output[outpos .. outpos + outlen],
755        ) {
756            Ok(written) => {
757                inpos += inlen;
758                outpos += written;
759                break;
760            }
761            Err(partial) => {
762                inpos += partial.read;
763                outpos += partial.written;
764            }
765        }
766        let (ipos, opos) =
767            decode_wrap_block(bit, msb, ctb, values, pad, &input[inpos ..], &mut output[outpos ..])
768                .map_err(|mut error| {
769                    error.position += inpos;
770                    DecodePartial { read: inpos, written: outpos, error }
771                })?;
772        inpos += ipos;
773        outpos += opos;
774    }
775    let inpos = skip_ignore(values, input, inpos);
776    if inpos == input.len() {
777        Ok(outpos)
778    } else {
779        Err(DecodePartial {
780            read: inpos,
781            written: outpos,
782            error: DecodeError { position: inpos, kind: DecodeKind::Length },
783        })
784    }
785}
786
787/// Order in which bits are read from a byte
788///
789/// The base-conversion encoding is always little-endian. This means that the least significant
790/// **byte** is always first. However, we can still choose whether, within a byte, this is the most
791/// significant or the least significant **bit** that is first. If the terminology is confusing,
792/// testing on an asymmetrical example should be enough to choose the correct value.
793///
794/// # Examples
795///
796/// In the following example, we can see that a base with the `MostSignificantFirst` bit-order has
797/// the most significant bit first in the encoded output. In particular, the output is in the same
798/// order as the bits in the byte. The opposite happens with the `LeastSignificantFirst` bit-order.
799/// The least significant bit is first and the output is in the reverse order.
800///
801/// ```rust
802/// use data_encoding::{BitOrder, Specification};
803/// let mut spec = Specification::new();
804/// spec.symbols.push_str("01");
805/// spec.bit_order = BitOrder::MostSignificantFirst;  // default
806/// let msb = spec.encoding().unwrap();
807/// spec.bit_order = BitOrder::LeastSignificantFirst;
808/// let lsb = spec.encoding().unwrap();
809/// assert_eq!(msb.encode(&[0b01010011]), "01010011");
810/// assert_eq!(lsb.encode(&[0b01010011]), "11001010");
811/// ```
812#[derive(Debug, Copy, Clone, PartialEq, Eq)]
813#[cfg(feature = "alloc")]
814pub enum BitOrder {
815    /// Most significant bit first
816    ///
817    /// This is the most common and most intuitive bit-order. In particular, this is the bit-order
818    /// used by [RFC4648] and thus the usual hexadecimal, base64, base32, base64url, and base32hex
819    /// encodings. This is the default bit-order when [specifying](struct.Specification.html) a
820    /// base.
821    ///
822    /// [RFC4648]: https://tools.ietf.org/html/rfc4648
823    MostSignificantFirst,
824
825    /// Least significant bit first
826    ///
827    /// # Examples
828    ///
829    /// DNSCurve [base32] uses least significant bit first:
830    ///
831    /// ```rust
832    /// use data_encoding::BASE32_DNSCURVE;
833    /// assert_eq!(BASE32_DNSCURVE.encode(&[0x64, 0x88]), "4321");
834    /// assert_eq!(BASE32_DNSCURVE.decode(b"4321").unwrap(), vec![0x64, 0x88]);
835    /// ```
836    ///
837    /// [base32]: constant.BASE32_DNSCURVE.html
838    LeastSignificantFirst,
839}
840#[cfg(feature = "alloc")]
841use crate::BitOrder::*;
842
843#[doc(hidden)]
844#[cfg(feature = "alloc")]
845pub type InternalEncoding = Cow<'static, [u8]>;
846
847#[doc(hidden)]
848#[cfg(not(feature = "alloc"))]
849pub type InternalEncoding = &'static [u8];
850
851/// Base-conversion encoding
852///
853/// See [Specification](struct.Specification.html) for technical details or how to define a new one.
854// Required fields:
855//   0 - 256 (256) symbols
856// 256 - 512 (256) values
857// 512 - 513 (  1) padding
858// 513 - 514 (  1) reserved(3),ctb(1),msb(1),bit(3)
859// Optional fields:
860// 514 - 515 (  1) width
861// 515 -   * (  N) separator
862// Invariants:
863// - symbols is 2^bit unique characters repeated 2^(8-bit) times
864// - values[128 ..] are INVALID
865// - values[0 .. 128] are either INVALID, IGNORE, PADDING, or < 2^bit
866// - padding is either < 128 or INVALID
867// - values[padding] is PADDING if padding < 128
868// - values and symbols are inverse
869// - ctb is true if 8 % bit == 0
870// - width is present if there is x such that values[x] is IGNORE
871// - width % dec(bit) == 0
872// - for all x in separator values[x] is IGNORE
873#[derive(Debug, Clone, PartialEq, Eq)]
874#[repr(transparent)]
875pub struct Encoding(#[doc(hidden)] pub InternalEncoding);
876
877/// How to translate characters when decoding
878///
879/// The order matters. The first character of the `from` field is translated to the first character
880/// of the `to` field. The second to the second. Etc.
881///
882/// See [Specification](struct.Specification.html) for more information.
883#[derive(Debug, Clone)]
884#[cfg(feature = "alloc")]
885pub struct Translate {
886    /// Characters to translate from
887    pub from: String,
888
889    /// Characters to translate to
890    pub to: String,
891}
892
893/// How to wrap the output when encoding
894///
895/// See [Specification](struct.Specification.html) for more information.
896#[derive(Debug, Clone)]
897#[cfg(feature = "alloc")]
898pub struct Wrap {
899    /// Wrapping width
900    ///
901    /// Must be a multiple of:
902    ///
903    /// - 8 for a bit-width of 1 (binary), 3 (octal), and 5 (base32)
904    /// - 4 for a bit-width of 2 (base4) and 6 (base64)
905    /// - 2 for a bit-width of 4 (hexadecimal)
906    ///
907    /// Wrapping is disabled if null.
908    pub width: usize,
909
910    /// Wrapping characters
911    ///
912    /// Wrapping is disabled if empty.
913    pub separator: String,
914}
915
916/// Base-conversion specification
917///
918/// It is possible to define custom encodings given a specification. To do so, it is important to
919/// understand the theory first.
920///
921/// # Theory
922///
923/// Each subsection has an equivalent subsection in the [Practice](#practice) section.
924///
925/// ## Basics
926///
927/// The main idea of a [base-conversion] encoding is to see `[u8]` as numbers written in
928/// little-endian base256 and convert them in another little-endian base. For performance reasons,
929/// this crate restricts this other base to be of size 2 (binary), 4 (base4), 8 (octal), 16
930/// (hexadecimal), 32 (base32), or 64 (base64). The converted number is written as `[u8]` although
931/// it doesn't use all the 256 possible values of `u8`. This crate encodes to ASCII, so only values
932/// smaller than 128 are allowed.
933///
934/// More precisely, we need the following elements:
935///
936/// - The bit-width N: 1 for binary, 2 for base4, 3 for octal, 4 for hexadecimal, 5 for base32, and
937///   6 for base64
938/// - The [bit-order](enum.BitOrder.html): most or least significant bit first
939/// - The symbols function S from [0, 2<sup>N</sup>) (called values and written `uN`) to symbols
940///   (represented as `u8` although only ASCII symbols are allowed, i.e. smaller than 128)
941/// - The values partial function V from ASCII to [0, 2<sup>N</sup>), i.e. from `u8` to `uN`
942/// - Whether trailing bits are checked: trailing bits are leading zeros in theory, but since
943///   numbers are little-endian they come last
944///
945/// For the encoding to be correct (i.e. encoding then decoding gives back the initial input),
946/// V(S(i)) must be defined and equal to i for all i in [0, 2<sup>N</sup>). For the encoding to be
947/// [canonical][canonical] (i.e. different inputs decode to different outputs, or equivalently,
948/// decoding then encoding gives back the initial input), trailing bits must be checked and if V(i)
949/// is defined then S(V(i)) is equal to i for all i.
950///
951/// Encoding and decoding are given by the following pipeline:
952///
953/// ```text
954/// [u8] <--1--> [[bit; 8]] <--2--> [[bit; N]] <--3--> [uN] <--4--> [u8]
955/// 1: Map bit-order between each u8 and [bit; 8]
956/// 2: Base conversion between base 2^8 and base 2^N (check trailing bits)
957/// 3: Map bit-order between each [bit; N] and uN
958/// 4: Map symbols/values between each uN and u8 (values must be defined)
959/// ```
960///
961/// ## Extensions
962///
963/// All these extensions make the encoding not canonical.
964///
965/// ### Padding
966///
967/// Padding is useful if the following conditions are met:
968///
969/// - the bit-width is 3 (octal), 5 (base32), or 6 (base64)
970/// - the length of the data to encode is not known in advance
971/// - the data must be sent without buffering
972///
973/// Bases for which the bit-width N does not divide 8 may not concatenate encoded data. This comes
974/// from the fact that it is not possible to make the difference between trailing bits and encoding
975/// bits. Padding solves this issue by adding a new character to discriminate between trailing bits
976/// and encoding bits. The idea is to work by blocks of lcm(8, N) bits, where lcm(8, N) is the least
977/// common multiple of 8 and N. When such block is not complete, it is padded.
978///
979/// To preserve correctness, the padding character must not be a symbol.
980///
981/// ### Ignore characters when decoding
982///
983/// Ignoring characters when decoding is useful if after encoding some characters are added for
984/// convenience or any other reason (like wrapping). In that case we want to first ignore those
985/// characters before decoding.
986///
987/// To preserve correctness, ignored characters must not contain symbols or the padding character.
988///
989/// ### Wrap output when encoding
990///
991/// Wrapping output when encoding is useful if the output is meant to be printed in a document where
992/// width is limited (typically 80-columns documents). In that case, the wrapping width and the
993/// wrapping separator have to be defined.
994///
995/// To preserve correctness, the wrapping separator characters must be ignored (see previous
996/// subsection). As such, wrapping separator characters must also not contain symbols or the padding
997/// character.
998///
999/// ### Translate characters when decoding
1000///
1001/// Translating characters when decoding is useful when encoded data may be copied by a humain
1002/// instead of a machine. Humans tend to confuse some characters for others. In that case we want to
1003/// translate those characters before decoding.
1004///
1005/// To preserve correctness, the characters we translate _from_ must not contain symbols or the
1006/// padding character, and the characters we translate _to_ must only contain symbols or the padding
1007/// character.
1008///
1009/// # Practice
1010///
1011/// ## Basics
1012///
1013/// ```rust
1014/// use data_encoding::{Encoding, Specification};
1015/// fn make_encoding(symbols: &str) -> Encoding {
1016///     let mut spec = Specification::new();
1017///     spec.symbols.push_str(symbols);
1018///     spec.encoding().unwrap()
1019/// }
1020/// let binary = make_encoding("01");
1021/// let octal = make_encoding("01234567");
1022/// let hexadecimal = make_encoding("0123456789abcdef");
1023/// assert_eq!(binary.encode(b"Bit"), "010000100110100101110100");
1024/// assert_eq!(octal.encode(b"Bit"), "20464564");
1025/// assert_eq!(hexadecimal.encode(b"Bit"), "426974");
1026/// ```
1027///
1028/// The `binary` base has 2 symbols `0` and `1` with value 0 and 1 respectively. The `octal` base
1029/// has 8 symbols `0` to `7` with value 0 to 7. The `hexadecimal` base has 16 symbols `0` to `9` and
1030/// `a` to `f` with value 0 to 15. The following diagram gives the idea of how encoding works in the
1031/// previous example (note that we can actually write such diagram only because the bit-order is
1032/// most significant first):
1033///
1034/// ```text
1035/// [      octal] |  2  :  0  :  4  :  6  :  4  :  5  :  6  :  4  |
1036/// [     binary] |0 1 0 0 0 0 1 0|0 1 1 0 1 0 0 1|0 1 1 1 0 1 0 0|
1037/// [hexadecimal] |   4   :   2   |   6   :   9   |   7   :   4   |
1038///                ^-- LSB                                       ^-- MSB
1039/// ```
1040///
1041/// Note that in theory, these little-endian numbers are read from right to left (the most
1042/// significant bit is at the right). Since leading zeros are meaningless (in our usual decimal
1043/// notation 0123 is the same as 123), it explains why trailing bits must be zero. Trailing bits may
1044/// occur when the bit-width of a base does not divide 8. Only binary, base4, and hexadecimal don't
1045/// have trailing bits issues. So let's consider octal and base64, which have trailing bits in
1046/// similar circumstances:
1047///
1048/// ```rust
1049/// use data_encoding::{Specification, BASE64_NOPAD};
1050/// let octal = {
1051///     let mut spec = Specification::new();
1052///     spec.symbols.push_str("01234567");
1053///     spec.encoding().unwrap()
1054/// };
1055/// assert_eq!(BASE64_NOPAD.encode(b"B"), "Qg");
1056/// assert_eq!(octal.encode(b"B"), "204");
1057/// ```
1058///
1059/// We have the following diagram, where the base64 values are written between parentheses:
1060///
1061/// ```text
1062/// [base64] |   Q(16)   :   g(32)   : [has 4 zero trailing bits]
1063/// [ octal] |  2  :  0  :  4  :       [has 1 zero trailing bit ]
1064///          |0 1 0 0 0 0 1 0|0 0 0 0
1065/// [ ascii] |       B       |
1066///                           ^-^-^-^-- leading zeros / trailing bits
1067/// ```
1068///
1069/// ## Extensions
1070///
1071/// ### Padding
1072///
1073/// For octal and base64, lcm(8, 3) == lcm(8, 6) == 24 bits or 3 bytes. For base32, lcm(8, 5) is 40
1074/// bits or 5 bytes. Let's consider octal and base64:
1075///
1076/// ```rust
1077/// use data_encoding::{Specification, BASE64};
1078/// let octal = {
1079///     let mut spec = Specification::new();
1080///     spec.symbols.push_str("01234567");
1081///     spec.padding = Some('=');
1082///     spec.encoding().unwrap()
1083/// };
1084/// // We start encoding but we only have "B" for now.
1085/// assert_eq!(BASE64.encode(b"B"), "Qg==");
1086/// assert_eq!(octal.encode(b"B"), "204=====");
1087/// // Now we have "it".
1088/// assert_eq!(BASE64.encode(b"it"), "aXQ=");
1089/// assert_eq!(octal.encode(b"it"), "322720==");
1090/// // By concatenating everything, we may decode the original data.
1091/// assert_eq!(BASE64.decode(b"Qg==aXQ=").unwrap(), b"Bit");
1092/// assert_eq!(octal.decode(b"204=====322720==").unwrap(), b"Bit");
1093/// ```
1094///
1095/// We have the following diagrams:
1096///
1097/// ```text
1098/// [base64] |   Q(16)   :   g(32)   :     =     :     =     |
1099/// [ octal] |  2  :  0  :  4  :  =  :  =  :  =  :  =  :  =  |
1100///          |0 1 0 0 0 0 1 0|. . . . . . . .|. . . . . . . .|
1101/// [ ascii] |       B       |        end of block aligned --^
1102///          ^-- beginning of block aligned
1103///
1104/// [base64] |   a(26)   :   X(23)   :   Q(16)   :     =     |
1105/// [ octal] |  3  :  2  :  2  :  7  :  2  :  0  :  =  :  =  |
1106///          |0 1 1 0 1 0 0 1|0 1 1 1 0 1 0 0|. . . . . . . .|
1107/// [ ascii] |       i       |       t       |
1108/// ```
1109///
1110/// ### Ignore characters when decoding
1111///
1112/// The typical use-case is to ignore newlines (`\r` and `\n`). But to keep the example small, we
1113/// will ignore spaces.
1114///
1115/// ```rust
1116/// let mut spec = data_encoding::HEXLOWER.specification();
1117/// spec.ignore.push_str(" \t");
1118/// let base = spec.encoding().unwrap();
1119/// assert_eq!(base.decode(b"42 69 74"), base.decode(b"426974"));
1120/// ```
1121///
1122/// ### Wrap output when encoding
1123///
1124/// The typical use-case is to wrap after 64 or 76 characters with a newline (`\r\n` or `\n`). But
1125/// to keep the example small, we will wrap after 8 characters with a space.
1126///
1127/// ```rust
1128/// let mut spec = data_encoding::BASE64.specification();
1129/// spec.wrap.width = 8;
1130/// spec.wrap.separator.push_str(" ");
1131/// let base64 = spec.encoding().unwrap();
1132/// assert_eq!(base64.encode(b"Hey you"), "SGV5IHlv dQ== ");
1133/// ```
1134///
1135/// Note that the output always ends with the separator.
1136///
1137/// ### Translate characters when decoding
1138///
1139/// The typical use-case is to translate lowercase to uppercase or reciprocally, but it is also used
1140/// for letters that look alike, like `O0` or `Il1`. Let's illustrate both examples.
1141///
1142/// ```rust
1143/// let mut spec = data_encoding::HEXLOWER.specification();
1144/// spec.translate.from.push_str("ABCDEFOIl");
1145/// spec.translate.to.push_str("abcdef011");
1146/// let base = spec.encoding().unwrap();
1147/// assert_eq!(base.decode(b"BOIl"), base.decode(b"b011"));
1148/// ```
1149///
1150/// [base-conversion]: https://en.wikipedia.org/wiki/Positional_notation#Base_conversion
1151/// [canonical]: https://tools.ietf.org/html/rfc4648#section-3.5
1152#[derive(Debug, Clone)]
1153#[cfg(feature = "alloc")]
1154pub struct Specification {
1155    /// Symbols
1156    ///
1157    /// The number of symbols must be 2, 4, 8, 16, 32, or 64. Symbols must be ASCII characters
1158    /// (smaller than 128) and they must be unique.
1159    pub symbols: String,
1160
1161    /// Bit-order
1162    ///
1163    /// The default is to use most significant bit first since it is the most common.
1164    pub bit_order: BitOrder,
1165
1166    /// Check trailing bits
1167    ///
1168    /// The default is to check trailing bits. This field is ignored when unnecessary (i.e. for
1169    /// base2, base4, and base16).
1170    pub check_trailing_bits: bool,
1171
1172    /// Padding
1173    ///
1174    /// The default is to not use padding. The padding character must be ASCII and must not be a
1175    /// symbol.
1176    pub padding: Option<char>,
1177
1178    /// Characters to ignore when decoding
1179    ///
1180    /// The default is to not ignore characters when decoding. The characters to ignore must be
1181    /// ASCII and must not be symbols or the padding character.
1182    pub ignore: String,
1183
1184    /// How to wrap the output when encoding
1185    ///
1186    /// The default is to not wrap the output when encoding. The wrapping characters must be ASCII
1187    /// and must not be symbols or the padding character.
1188    pub wrap: Wrap,
1189
1190    /// How to translate characters when decoding
1191    ///
1192    /// The default is to not translate characters when decoding. The characters to translate from
1193    /// must be ASCII and must not have already been assigned a semantics. The characters to
1194    /// translate to must be ASCII and must have been assigned a semantics (symbol, padding
1195    /// character, or ignored character).
1196    pub translate: Translate,
1197}
1198
1199#[cfg(feature = "alloc")]
1200impl Default for Specification {
1201    fn default() -> Self {
1202        Self::new()
1203    }
1204}
1205
1206impl Encoding {
1207    fn sym(&self) -> &[u8; 256] {
1208        self.0[0 .. 256].try_into().unwrap()
1209    }
1210
1211    fn val(&self) -> &[u8; 256] {
1212        self.0[256 .. 512].try_into().unwrap()
1213    }
1214
1215    fn pad(&self) -> Option<u8> {
1216        if self.0[512] < 128 {
1217            Some(self.0[512])
1218        } else {
1219            None
1220        }
1221    }
1222
1223    fn ctb(&self) -> bool {
1224        self.0[513] & 0x10 != 0
1225    }
1226
1227    fn msb(&self) -> bool {
1228        self.0[513] & 0x8 != 0
1229    }
1230
1231    fn bit(&self) -> usize {
1232        (self.0[513] & 0x7) as usize
1233    }
1234
1235    /// Minimum number of input and output blocks when encoding
1236    fn block_len(&self) -> (usize, usize) {
1237        let bit = self.bit();
1238        match self.wrap() {
1239            Some((col, end)) => (col / dec(bit) * enc(bit), col + end.len()),
1240            None => (enc(bit), dec(bit)),
1241        }
1242    }
1243
1244    fn wrap(&self) -> Option<(usize, &[u8])> {
1245        if self.0.len() <= 515 {
1246            return None;
1247        }
1248        Some((self.0[514] as usize, &self.0[515 ..]))
1249    }
1250
1251    fn has_ignore(&self) -> bool {
1252        self.0.len() >= 515
1253    }
1254
1255    /// Returns the encoded length of an input of length `len`
1256    ///
1257    /// See [`encode_mut`] for when to use it.
1258    ///
1259    /// # Panics
1260    ///
1261    /// May panic if `len` is greater than `usize::MAX / 512`:
1262    /// - `len <= 8_388_607` when `target_pointer_width = "32"`
1263    /// - `len <= 36028_797018_963967` when `target_pointer_width = "64"`
1264    ///
1265    /// If you need to encode an input of length greater than this limit (possibly of infinite
1266    /// length), then you must chunk your input, encode each chunk, and concatenate to obtain the
1267    /// output. The length of each input chunk must be a multiple of [`encode_align`].
1268    ///
1269    /// Note that this function only _may_ panic in those cases. The function may also return the
1270    /// correct value in some cases depending on the implementation. In other words, those limits
1271    /// are the guarantee below which the function will not panic, and not the guarantee above which
1272    /// the function will panic.
1273    ///
1274    /// [`encode_align`]: struct.Encoding.html#method.encode_align
1275    /// [`encode_mut`]: struct.Encoding.html#method.encode_mut
1276    #[must_use]
1277    pub fn encode_len(&self, len: usize) -> usize {
1278        assert!(len <= usize::MAX / 512);
1279        dispatch! {
1280            let bit: usize = self.bit();
1281            let pad: Option<u8> = self.pad();
1282            let wrap: Option<(usize, &[u8])> = self.wrap();
1283            encode_wrap_len(bit, pad, wrap, len)
1284        }
1285    }
1286
1287    /// Returns the minimum alignment when chunking a long input
1288    ///
1289    /// See [`encode_len`] for context.
1290    ///
1291    /// [`encode_len`]: struct.Encoding.html#method.encode_len
1292    #[must_use]
1293    pub fn encode_align(&self) -> usize {
1294        let bit = self.bit();
1295        match self.wrap() {
1296            None => enc(bit),
1297            Some((col, _)) => col * bit / 8,
1298        }
1299    }
1300
1301    /// Encodes `input` in `output`
1302    ///
1303    /// # Panics
1304    ///
1305    /// Panics if the `output` length does not match the result of [`encode_len`] for the `input`
1306    /// length.
1307    ///
1308    /// # Examples
1309    ///
1310    /// ```rust
1311    /// use data_encoding::BASE64;
1312    /// # let mut buffer = vec![0; 100];
1313    /// let input = b"Hello world";
1314    /// let output = &mut buffer[0 .. BASE64.encode_len(input.len())];
1315    /// BASE64.encode_mut(input, output);
1316    /// assert_eq!(output, b"SGVsbG8gd29ybGQ=");
1317    /// ```
1318    ///
1319    /// [`encode_len`]: struct.Encoding.html#method.encode_len
1320    #[allow(clippy::cognitive_complexity)]
1321    pub fn encode_mut(&self, input: &[u8], output: &mut [u8]) {
1322        assert_eq!(output.len(), self.encode_len(input.len()));
1323        dispatch! {
1324            let bit: usize = self.bit();
1325            let msb: bool = self.msb();
1326            let pad: Option<u8> = self.pad();
1327            let wrap: Option<(usize, &[u8])> = self.wrap();
1328            encode_wrap_mut(bit, msb, self.sym(), pad, wrap, input, output)
1329        }
1330    }
1331
1332    /// Encodes `input` in `output` and returns it as a `&str`
1333    ///
1334    /// It is guaranteed that `output` and the return value only differ by their type. They both
1335    /// point to the same range of memory (pointer and length).
1336    ///
1337    /// # Panics
1338    ///
1339    /// Panics if the `output` length does not match the result of [`encode_len`] for the `input`
1340    /// length.
1341    ///
1342    /// # Examples
1343    ///
1344    /// ```rust
1345    /// use data_encoding::BASE64;
1346    /// # let mut buffer = vec![0; 100];
1347    /// let input = b"Hello world";
1348    /// let output = &mut buffer[0 .. BASE64.encode_len(input.len())];
1349    /// assert_eq!(BASE64.encode_mut_str(input, output), "SGVsbG8gd29ybGQ=");
1350    /// ```
1351    ///
1352    /// [`encode_len`]: struct.Encoding.html#method.encode_len
1353    pub fn encode_mut_str<'a>(&self, input: &[u8], output: &'a mut [u8]) -> &'a str {
1354        self.encode_mut(input, output);
1355        safety_assert!(output.is_ascii());
1356        // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1357        unsafe { core::str::from_utf8_unchecked(output) }
1358    }
1359
1360    /// Appends the encoding of `input` to `output`
1361    ///
1362    /// # Examples
1363    ///
1364    /// ```rust
1365    /// use data_encoding::BASE64;
1366    /// # let mut buffer = vec![0; 100];
1367    /// let input = b"Hello world";
1368    /// let mut output = "Result: ".to_string();
1369    /// BASE64.encode_append(input, &mut output);
1370    /// assert_eq!(output, "Result: SGVsbG8gd29ybGQ=");
1371    /// ```
1372    #[cfg(feature = "alloc")]
1373    pub fn encode_append(&self, input: &[u8], output: &mut String) {
1374        // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted below).
1375        let output = unsafe { output.as_mut_vec() };
1376        let output_len = output.len();
1377        output.resize(output_len + self.encode_len(input.len()), 0u8);
1378        self.encode_mut(input, &mut output[output_len ..]);
1379        safety_assert!(output[output_len ..].is_ascii());
1380    }
1381
1382    /// Returns an object to encode a fragmented input and append it to `output`
1383    ///
1384    /// See the documentation of [`Encoder`] for more details and examples.
1385    #[cfg(feature = "alloc")]
1386    pub fn new_encoder<'a>(&'a self, output: &'a mut String) -> Encoder<'a> {
1387        Encoder::new(self, output)
1388    }
1389
1390    /// Writes the encoding of `input` to `output`
1391    ///
1392    /// This allocates a buffer of 1024 bytes on the stack. If you want to control the buffer size
1393    /// and location, use [`Encoding::encode_write_buffer()`] instead.
1394    ///
1395    /// # Errors
1396    ///
1397    /// Returns an error when writing to the output fails.
1398    pub fn encode_write(
1399        &self, input: &[u8], output: &mut impl core::fmt::Write,
1400    ) -> core::fmt::Result {
1401        self.encode_write_buffer(input, output, &mut [0; 1024])
1402    }
1403
1404    /// Writes the encoding of `input` to `output` using a temporary `buffer`
1405    ///
1406    /// # Panics
1407    ///
1408    /// Panics if the buffer is shorter than 510 bytes.
1409    ///
1410    /// # Errors
1411    ///
1412    /// Returns an error when writing to the output fails.
1413    pub fn encode_write_buffer(
1414        &self, input: &[u8], output: &mut impl core::fmt::Write, buffer: &mut [u8],
1415    ) -> core::fmt::Result {
1416        assert!(510 <= buffer.len());
1417        let (enc, dec) = self.block_len();
1418        for input in input.chunks(buffer.len() / dec * enc) {
1419            let buffer = &mut buffer[.. self.encode_len(input.len())];
1420            self.encode_mut(input, buffer);
1421            safety_assert!(buffer.is_ascii());
1422            // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1423            output.write_str(unsafe { core::str::from_utf8_unchecked(buffer) })?;
1424        }
1425        Ok(())
1426    }
1427
1428    /// Returns an object to display the encoding of `input`
1429    ///
1430    /// # Examples
1431    ///
1432    /// ```rust
1433    /// use data_encoding::BASE64;
1434    /// assert_eq!(
1435    ///     format!("Payload: {}", BASE64.encode_display(b"Hello world")),
1436    ///     "Payload: SGVsbG8gd29ybGQ=",
1437    /// );
1438    /// ```
1439    #[must_use]
1440    pub fn encode_display<'a>(&'a self, input: &'a [u8]) -> Display<'a> {
1441        Display { encoding: self, input }
1442    }
1443
1444    /// Returns encoded `input`
1445    ///
1446    /// # Examples
1447    ///
1448    /// ```rust
1449    /// use data_encoding::BASE64;
1450    /// assert_eq!(BASE64.encode(b"Hello world"), "SGVsbG8gd29ybGQ=");
1451    /// ```
1452    #[cfg(feature = "alloc")]
1453    #[must_use]
1454    pub fn encode(&self, input: &[u8]) -> String {
1455        let mut output = vec![0u8; self.encode_len(input.len())];
1456        self.encode_mut(input, &mut output);
1457        safety_assert!(output.is_ascii());
1458        // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1459        unsafe { String::from_utf8_unchecked(output) }
1460    }
1461
1462    /// Returns the maximum decoded length of an input of length `len`
1463    ///
1464    /// See [`decode_mut`] for when to use it. In particular, the actual decoded length might be
1465    /// smaller if the actual input contains padding or ignored characters.
1466    ///
1467    /// # Panics
1468    ///
1469    /// May panic if `len` is greater than `usize::MAX / 8`:
1470    /// - `len <= 536_870_911` when `target_pointer_width = "32"`
1471    /// - `len <= 2_305843_009213_693951` when `target_pointer_width = "64"`
1472    ///
1473    /// If you need to decode an input of length greater than this limit (possibly of infinite
1474    /// length), then you must decode your input chunk by chunk with [`decode_mut`], making sure
1475    /// that you take into account how many bytes have been read from the input and how many bytes
1476    /// have been written to the output:
1477    /// - `Ok(written)` means all bytes have been read and `written` bytes have been written
1478    /// - `Err(DecodePartial { error, .. })` means an error occurred if `error.kind !=
1479    ///   DecodeKind::Length` or this was the last input chunk
1480    /// - `Err(DecodePartial { read, written, .. })` means that `read` bytes have been read and
1481    ///   `written` bytes written (the error can be ignored)
1482    ///
1483    /// Note that this function only _may_ panic in those cases. The function may also return the
1484    /// correct value in some cases depending on the implementation. In other words, those limits
1485    /// are the guarantee below which the function will not panic, and not the guarantee above which
1486    /// the function will panic.
1487    ///
1488    /// # Errors
1489    ///
1490    /// Returns an error if `len` is invalid. The error kind is [`Length`] and the [position] is the
1491    /// greatest valid input length.
1492    ///
1493    /// [`decode_mut`]: struct.Encoding.html#method.decode_mut
1494    /// [`Length`]: enum.DecodeKind.html#variant.Length
1495    /// [position]: struct.DecodeError.html#structfield.position
1496    pub fn decode_len(&self, len: usize) -> Result<usize, DecodeError> {
1497        assert!(len <= usize::MAX / 8);
1498        let (ilen, olen) = dispatch! {
1499            let bit: usize = self.bit();
1500            let pad: bool = self.pad().is_some();
1501            decode_wrap_len(bit, pad, len)
1502        };
1503        check!(
1504            DecodeError { position: ilen, kind: DecodeKind::Length },
1505            self.has_ignore() || len == ilen
1506        );
1507        Ok(olen)
1508    }
1509
1510    /// Decodes `input` in `output`
1511    ///
1512    /// Returns the length of the decoded output. This length may be smaller than the output length
1513    /// if the input contained padding or ignored characters. The output bytes after the returned
1514    /// length are not initialized and should not be read.
1515    ///
1516    /// # Panics
1517    ///
1518    /// Panics if the `output` length does not match the result of [`decode_len`] for the `input`
1519    /// length. Also panics if `decode_len` fails for the `input` length.
1520    ///
1521    /// # Errors
1522    ///
1523    /// Returns an error if `input` is invalid. See [`decode`] for more details. The are two
1524    /// differences though:
1525    ///
1526    /// - [`Length`] may be returned only if the encoding allows ignored characters, because
1527    ///   otherwise this is already checked by [`decode_len`].
1528    /// - The [`read`] first bytes of the input have been successfully decoded to the [`written`]
1529    ///   first bytes of the output.
1530    ///
1531    /// # Examples
1532    ///
1533    /// ```rust
1534    /// use data_encoding::BASE64;
1535    /// # let mut buffer = vec![0; 100];
1536    /// let input = b"SGVsbA==byB3b3JsZA==";
1537    /// let output = &mut buffer[0 .. BASE64.decode_len(input.len()).unwrap()];
1538    /// let len = BASE64.decode_mut(input, output).unwrap();
1539    /// assert_eq!(&output[0 .. len], b"Hello world");
1540    /// ```
1541    ///
1542    /// [`decode_len`]: struct.Encoding.html#method.decode_len
1543    /// [`decode`]: struct.Encoding.html#method.decode
1544    /// [`Length`]: enum.DecodeKind.html#variant.Length
1545    /// [`read`]: struct.DecodePartial.html#structfield.read
1546    /// [`written`]: struct.DecodePartial.html#structfield.written
1547    #[allow(clippy::cognitive_complexity)]
1548    pub fn decode_mut(&self, input: &[u8], output: &mut [u8]) -> Result<usize, DecodePartial> {
1549        assert_eq!(Ok(output.len()), self.decode_len(input.len()));
1550        dispatch! {
1551            let bit: usize = self.bit();
1552            let msb: bool = self.msb();
1553            let pad: bool = self.pad().is_some();
1554            let has_ignore: bool = self.has_ignore();
1555            decode_wrap_mut(bit, msb, self.ctb(), self.val(), pad, has_ignore,
1556                            input, output)
1557        }
1558    }
1559
1560    /// Returns decoded `input`
1561    ///
1562    /// # Errors
1563    ///
1564    /// Returns an error if `input` is invalid. The error kind can be:
1565    ///
1566    /// - [`Length`] if the input length is invalid. The [position] is the greatest valid input
1567    ///   length.
1568    /// - [`Symbol`] if the input contains an invalid character. The [position] is the first invalid
1569    ///   character.
1570    /// - [`Trailing`] if the input has non-zero trailing bits. This is only possible if the
1571    ///   encoding checks trailing bits. The [position] is the first character containing non-zero
1572    ///   trailing bits.
1573    /// - [`Padding`] if the input has an invalid padding length. This is only possible if the
1574    ///   encoding uses padding. The [position] is the first padding character of the first padding
1575    ///   of invalid length.
1576    ///
1577    /// # Examples
1578    ///
1579    /// ```rust
1580    /// use data_encoding::BASE64;
1581    /// assert_eq!(BASE64.decode(b"SGVsbA==byB3b3JsZA==").unwrap(), b"Hello world");
1582    /// ```
1583    ///
1584    /// [`Length`]: enum.DecodeKind.html#variant.Length
1585    /// [`Symbol`]: enum.DecodeKind.html#variant.Symbol
1586    /// [`Trailing`]: enum.DecodeKind.html#variant.Trailing
1587    /// [`Padding`]: enum.DecodeKind.html#variant.Padding
1588    /// [position]: struct.DecodeError.html#structfield.position
1589    #[cfg(feature = "alloc")]
1590    pub fn decode(&self, input: &[u8]) -> Result<Vec<u8>, DecodeError> {
1591        let mut output = vec![0u8; self.decode_len(input.len())?];
1592        let len = self.decode_mut(input, &mut output).map_err(|partial| partial.error)?;
1593        output.truncate(len);
1594        Ok(output)
1595    }
1596
1597    /// Returns the bit-width
1598    #[must_use]
1599    pub fn bit_width(&self) -> usize {
1600        self.bit()
1601    }
1602
1603    /// Returns whether the encoding is canonical
1604    ///
1605    /// An encoding is not canonical if one of the following conditions holds:
1606    ///
1607    /// - trailing bits are not checked
1608    /// - padding is used
1609    /// - characters are ignored
1610    /// - characters are translated
1611    #[must_use]
1612    pub fn is_canonical(&self) -> bool {
1613        if !self.ctb() {
1614            return false;
1615        }
1616        let bit = self.bit();
1617        let sym = self.sym();
1618        let val = self.val();
1619        for i in 0 .. 256 {
1620            if val[i] == INVALID {
1621                continue;
1622            }
1623            if val[i] >= 1 << bit {
1624                return false;
1625            }
1626            if sym[val[i] as usize] as usize != i {
1627                return false;
1628            }
1629        }
1630        true
1631    }
1632
1633    /// Returns the encoding specification
1634    #[allow(clippy::missing_panics_doc)] // no panic
1635    #[cfg(feature = "alloc")]
1636    #[must_use]
1637    pub fn specification(&self) -> Specification {
1638        let mut specification = Specification::new();
1639        specification
1640            .symbols
1641            .push_str(core::str::from_utf8(&self.sym()[0 .. 1 << self.bit()]).unwrap());
1642        specification.bit_order =
1643            if self.msb() { MostSignificantFirst } else { LeastSignificantFirst };
1644        specification.check_trailing_bits = self.ctb();
1645        if let Some(pad) = self.pad() {
1646            specification.padding = Some(pad as char);
1647        }
1648        for i in 0 .. 128u8 {
1649            if self.val()[i as usize] != IGNORE {
1650                continue;
1651            }
1652            specification.ignore.push(i as char);
1653        }
1654        if let Some((col, end)) = self.wrap() {
1655            specification.wrap.width = col;
1656            specification.wrap.separator = core::str::from_utf8(end).unwrap().to_owned();
1657        }
1658        for i in 0 .. 128u8 {
1659            let canonical = if self.val()[i as usize] < 1 << self.bit() {
1660                self.sym()[self.val()[i as usize] as usize]
1661            } else if self.val()[i as usize] == PADDING {
1662                self.pad().unwrap()
1663            } else {
1664                continue;
1665            };
1666            if i == canonical {
1667                continue;
1668            }
1669            specification.translate.from.push(i as char);
1670            specification.translate.to.push(canonical as char);
1671        }
1672        specification
1673    }
1674
1675    #[doc(hidden)]
1676    #[must_use]
1677    pub const fn internal_new(implementation: &'static [u8]) -> Encoding {
1678        #[cfg(feature = "alloc")]
1679        let encoding = Encoding(Cow::Borrowed(implementation));
1680        #[cfg(not(feature = "alloc"))]
1681        let encoding = Encoding(implementation);
1682        encoding
1683    }
1684
1685    #[doc(hidden)]
1686    #[must_use]
1687    pub fn internal_implementation(&self) -> &[u8] {
1688        &self.0
1689    }
1690}
1691
1692/// Encodes fragmented input to an output
1693///
1694/// It is equivalent to use an [`Encoder`] with multiple calls to [`Encoder::append()`] than to
1695/// first concatenate all the input and then use [`Encoding::encode_append()`]. In particular, this
1696/// function will not introduce padding or wrapping between inputs.
1697///
1698/// # Examples
1699///
1700/// ```rust
1701/// // This is a bit inconvenient but we can't take a long-term reference to data_encoding::BASE64
1702/// // because it's a constant. We need to use a static which has an address instead. This will be
1703/// // fixed in version 3 of the library.
1704/// static BASE64: data_encoding::Encoding = data_encoding::BASE64;
1705/// let mut output = String::new();
1706/// let mut encoder = BASE64.new_encoder(&mut output);
1707/// encoder.append(b"hello");
1708/// encoder.append(b"world");
1709/// encoder.finalize();
1710/// assert_eq!(output, BASE64.encode(b"helloworld"));
1711/// ```
1712#[derive(Debug)]
1713#[cfg(feature = "alloc")]
1714pub struct Encoder<'a> {
1715    encoding: &'a Encoding,
1716    output: &'a mut String,
1717    buffer: [u8; 255],
1718    length: u8,
1719}
1720
1721#[cfg(feature = "alloc")]
1722impl Drop for Encoder<'_> {
1723    fn drop(&mut self) {
1724        self.encoding.encode_append(&self.buffer[.. self.length as usize], self.output);
1725    }
1726}
1727
1728#[cfg(feature = "alloc")]
1729impl<'a> Encoder<'a> {
1730    fn new(encoding: &'a Encoding, output: &'a mut String) -> Self {
1731        Encoder { encoding, output, buffer: [0; 255], length: 0 }
1732    }
1733
1734    /// Encodes the provided input fragment and appends the result to the output
1735    pub fn append(&mut self, mut input: &[u8]) {
1736        #[allow(clippy::cast_possible_truncation)] // no truncation
1737        let max = self.encoding.block_len().0 as u8;
1738        if self.length != 0 {
1739            let len = self.length;
1740            #[allow(clippy::cast_possible_truncation)] // no truncation
1741            let add = core::cmp::min((max - len) as usize, input.len()) as u8;
1742            self.buffer[len as usize ..][.. add as usize].copy_from_slice(&input[.. add as usize]);
1743            self.length += add;
1744            input = &input[add as usize ..];
1745            if self.length != max {
1746                debug_assert!(self.length < max);
1747                debug_assert!(input.is_empty());
1748                return;
1749            }
1750            self.encoding.encode_append(&self.buffer[.. max as usize], self.output);
1751            self.length = 0;
1752        }
1753        let len = floor(input.len(), max as usize);
1754        self.encoding.encode_append(&input[.. len], self.output);
1755        input = &input[len ..];
1756        #[allow(clippy::cast_possible_truncation)] // no truncation
1757        let len = input.len() as u8;
1758        self.buffer[.. len as usize].copy_from_slice(input);
1759        self.length = len;
1760    }
1761
1762    /// Makes sure all inputs have been encoded and appended to the output
1763    ///
1764    /// This is equivalent to dropping the encoder and required for correctness, otherwise some
1765    /// encoded data may be missing at the end.
1766    pub fn finalize(self) {}
1767}
1768
1769/// Wraps an encoding and input for display purposes.
1770#[derive(Debug)]
1771pub struct Display<'a> {
1772    encoding: &'a Encoding,
1773    input: &'a [u8],
1774}
1775
1776impl core::fmt::Display for Display<'_> {
1777    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1778        self.encoding.encode_write(self.input, f)
1779    }
1780}
1781
1782#[derive(Debug, Copy, Clone)]
1783#[cfg(feature = "alloc")]
1784enum SpecificationErrorImpl {
1785    BadSize,
1786    NotAscii,
1787    Duplicate(u8),
1788    ExtraPadding,
1789    WrapLength,
1790    WrapWidth(u8),
1791    FromTo,
1792    Undefined(u8),
1793}
1794#[cfg(feature = "alloc")]
1795use crate::SpecificationErrorImpl::*;
1796
1797/// Specification error
1798#[derive(Debug, Copy, Clone)]
1799#[cfg(feature = "alloc")]
1800pub struct SpecificationError(SpecificationErrorImpl);
1801
1802#[cfg(feature = "alloc")]
1803impl core::fmt::Display for SpecificationError {
1804    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1805        match self.0 {
1806            BadSize => write!(f, "invalid number of symbols"),
1807            NotAscii => write!(f, "non-ascii character"),
1808            Duplicate(c) => write!(f, "{:?} has conflicting definitions", c as char),
1809            ExtraPadding => write!(f, "unnecessary padding"),
1810            WrapLength => write!(f, "invalid wrap width or separator length"),
1811            WrapWidth(x) => write!(f, "wrap width not a multiple of {}", x),
1812            FromTo => write!(f, "translate from/to length mismatch"),
1813            Undefined(c) => write!(f, "{:?} is undefined", c as char),
1814        }
1815    }
1816}
1817
1818#[cfg(feature = "std")]
1819impl std::error::Error for SpecificationError {
1820    fn description(&self) -> &str {
1821        match self.0 {
1822            BadSize => "invalid number of symbols",
1823            NotAscii => "non-ascii character",
1824            Duplicate(_) => "conflicting definitions",
1825            ExtraPadding => "unnecessary padding",
1826            WrapLength => "invalid wrap width or separator length",
1827            WrapWidth(_) => "wrap width not a multiple",
1828            FromTo => "translate from/to length mismatch",
1829            Undefined(_) => "undefined character",
1830        }
1831    }
1832}
1833
1834#[cfg(feature = "alloc")]
1835impl Specification {
1836    /// Returns a default specification
1837    #[must_use]
1838    pub fn new() -> Specification {
1839        Specification {
1840            symbols: String::new(),
1841            bit_order: MostSignificantFirst,
1842            check_trailing_bits: true,
1843            padding: None,
1844            ignore: String::new(),
1845            wrap: Wrap { width: 0, separator: String::new() },
1846            translate: Translate { from: String::new(), to: String::new() },
1847        }
1848    }
1849
1850    /// Returns the specified encoding
1851    ///
1852    /// # Errors
1853    ///
1854    /// Returns an error if the specification is invalid.
1855    pub fn encoding(&self) -> Result<Encoding, SpecificationError> {
1856        let symbols = self.symbols.as_bytes();
1857        let bit: u8 = match symbols.len() {
1858            2 => 1,
1859            4 => 2,
1860            8 => 3,
1861            16 => 4,
1862            32 => 5,
1863            64 => 6,
1864            _ => return Err(SpecificationError(BadSize)),
1865        };
1866        let mut values = [INVALID; 128];
1867        let set = |v: &mut [u8; 128], i: u8, x: u8| {
1868            check!(SpecificationError(NotAscii), i < 128);
1869            if v[i as usize] == x {
1870                return Ok(());
1871            }
1872            check!(SpecificationError(Duplicate(i)), v[i as usize] == INVALID);
1873            v[i as usize] = x;
1874            Ok(())
1875        };
1876        for (v, symbols) in symbols.iter().enumerate() {
1877            #[allow(clippy::cast_possible_truncation)] // no truncation
1878            set(&mut values, *symbols, v as u8)?;
1879        }
1880        let msb = self.bit_order == MostSignificantFirst;
1881        let ctb = self.check_trailing_bits || 8 % bit == 0;
1882        let pad = match self.padding {
1883            None => None,
1884            Some(pad) => {
1885                check!(SpecificationError(ExtraPadding), 8 % bit != 0);
1886                check!(SpecificationError(NotAscii), pad.len_utf8() == 1);
1887                set(&mut values, pad as u8, PADDING)?;
1888                Some(pad as u8)
1889            }
1890        };
1891        for i in self.ignore.bytes() {
1892            set(&mut values, i, IGNORE)?;
1893        }
1894        let wrap = if self.wrap.separator.is_empty() || self.wrap.width == 0 {
1895            None
1896        } else {
1897            let col = self.wrap.width;
1898            let end = self.wrap.separator.as_bytes();
1899            check!(SpecificationError(WrapLength), col < 256 && end.len() < 256);
1900            #[allow(clippy::cast_possible_truncation)] // no truncation
1901            let col = col as u8;
1902            #[allow(clippy::cast_possible_truncation)] // no truncation
1903            let dec = dec(bit as usize) as u8;
1904            check!(SpecificationError(WrapWidth(dec)), col % dec == 0);
1905            for &i in end {
1906                set(&mut values, i, IGNORE)?;
1907            }
1908            Some((col, end))
1909        };
1910        let from = self.translate.from.as_bytes();
1911        let to = self.translate.to.as_bytes();
1912        check!(SpecificationError(FromTo), from.len() == to.len());
1913        for i in 0 .. from.len() {
1914            check!(SpecificationError(NotAscii), to[i] < 128);
1915            let v = values[to[i] as usize];
1916            check!(SpecificationError(Undefined(to[i])), v != INVALID);
1917            set(&mut values, from[i], v)?;
1918        }
1919        let mut encoding = Vec::new();
1920        for _ in 0 .. 256 / symbols.len() {
1921            encoding.extend_from_slice(symbols);
1922        }
1923        encoding.extend_from_slice(&values);
1924        encoding.extend_from_slice(&[INVALID; 128]);
1925        match pad {
1926            None => encoding.push(INVALID),
1927            Some(pad) => encoding.push(pad),
1928        }
1929        encoding.push(bit);
1930        if msb {
1931            encoding[513] |= 0x08;
1932        }
1933        if ctb {
1934            encoding[513] |= 0x10;
1935        }
1936        if let Some((col, end)) = wrap {
1937            encoding.push(col);
1938            encoding.extend_from_slice(end);
1939        } else if values.contains(&IGNORE) {
1940            encoding.push(0);
1941        }
1942        Ok(Encoding(Cow::Owned(encoding)))
1943    }
1944}
1945
1946/// Lowercase hexadecimal encoding
1947///
1948/// This encoding is a static version of:
1949///
1950/// ```rust
1951/// # use data_encoding::{Specification, HEXLOWER};
1952/// let mut spec = Specification::new();
1953/// spec.symbols.push_str("0123456789abcdef");
1954/// assert_eq!(HEXLOWER, spec.encoding().unwrap());
1955/// ```
1956///
1957/// # Examples
1958///
1959/// ```rust
1960/// use data_encoding::HEXLOWER;
1961/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1962/// assert_eq!(HEXLOWER.decode(b"deadbeef").unwrap(), deadbeef);
1963/// assert_eq!(HEXLOWER.encode(&deadbeef), "deadbeef");
1964/// ```
1965pub const HEXLOWER: Encoding = Encoding::internal_new(HEXLOWER_IMPL);
1966const HEXLOWER_IMPL: &[u8] = &[
1967    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1968    55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1969    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1970    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1971    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1972    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1973    56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1974    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1975    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1976    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1977    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1978    56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1979    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1980    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1981    3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1982    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1983    128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1984    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1985    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1986    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1987    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1988    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1989    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1990    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1991    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1992];
1993
1994/// Lowercase hexadecimal encoding with case-insensitive decoding
1995///
1996/// This encoding is a static version of:
1997///
1998/// ```rust
1999/// # use data_encoding::{Specification, HEXLOWER_PERMISSIVE};
2000/// let mut spec = Specification::new();
2001/// spec.symbols.push_str("0123456789abcdef");
2002/// spec.translate.from.push_str("ABCDEF");
2003/// spec.translate.to.push_str("abcdef");
2004/// assert_eq!(HEXLOWER_PERMISSIVE, spec.encoding().unwrap());
2005/// ```
2006///
2007/// # Examples
2008///
2009/// ```rust
2010/// use data_encoding::HEXLOWER_PERMISSIVE;
2011/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
2012/// assert_eq!(HEXLOWER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
2013/// assert_eq!(HEXLOWER_PERMISSIVE.encode(&deadbeef), "deadbeef");
2014/// ```
2015///
2016/// You can also define a shorter name:
2017///
2018/// ```rust
2019/// use data_encoding::{Encoding, HEXLOWER_PERMISSIVE};
2020/// const HEX: Encoding = HEXLOWER_PERMISSIVE;
2021/// ```
2022pub const HEXLOWER_PERMISSIVE: Encoding = Encoding::internal_new(HEXLOWER_PERMISSIVE_IMPL);
2023const HEXLOWER_PERMISSIVE_IMPL: &[u8] = &[
2024    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
2025    55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
2026    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
2027    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
2028    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
2029    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
2030    56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
2031    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
2032    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
2033    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
2034    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
2035    56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2036    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2037    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
2038    3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128,
2039    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2040    128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2041    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2042    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2043    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2044    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2045    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2046    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2047    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2048    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2049];
2050
2051/// Uppercase hexadecimal encoding
2052///
2053/// This encoding is a static version of:
2054///
2055/// ```rust
2056/// # use data_encoding::{Specification, HEXUPPER};
2057/// let mut spec = Specification::new();
2058/// spec.symbols.push_str("0123456789ABCDEF");
2059/// assert_eq!(HEXUPPER, spec.encoding().unwrap());
2060/// ```
2061///
2062/// It is compliant with [RFC4648] and known as "base16" or "hex".
2063///
2064/// # Examples
2065///
2066/// ```rust
2067/// use data_encoding::HEXUPPER;
2068/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
2069/// assert_eq!(HEXUPPER.decode(b"DEADBEEF").unwrap(), deadbeef);
2070/// assert_eq!(HEXUPPER.encode(&deadbeef), "DEADBEEF");
2071/// ```
2072///
2073/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-8
2074pub const HEXUPPER: Encoding = Encoding::internal_new(HEXUPPER_IMPL);
2075const HEXUPPER_IMPL: &[u8] = &[
2076    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2077    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2078    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2079    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2080    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2081    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2082    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2083    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2084    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2085    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2086    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2087    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2088    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2089    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2090    12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2091    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2092    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2093    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2094    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2095    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2096    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2097    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2098    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2099    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2100];
2101
2102/// Uppercase hexadecimal encoding with case-insensitive decoding
2103///
2104/// This encoding is a static version of:
2105///
2106/// ```rust
2107/// # use data_encoding::{Specification, HEXUPPER_PERMISSIVE};
2108/// let mut spec = Specification::new();
2109/// spec.symbols.push_str("0123456789ABCDEF");
2110/// spec.translate.from.push_str("abcdef");
2111/// spec.translate.to.push_str("ABCDEF");
2112/// assert_eq!(HEXUPPER_PERMISSIVE, spec.encoding().unwrap());
2113/// ```
2114///
2115/// # Examples
2116///
2117/// ```rust
2118/// use data_encoding::HEXUPPER_PERMISSIVE;
2119/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
2120/// assert_eq!(HEXUPPER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
2121/// assert_eq!(HEXUPPER_PERMISSIVE.encode(&deadbeef), "DEADBEEF");
2122/// ```
2123pub const HEXUPPER_PERMISSIVE: Encoding = Encoding::internal_new(HEXUPPER_PERMISSIVE_IMPL);
2124const HEXUPPER_PERMISSIVE_IMPL: &[u8] = &[
2125    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2126    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2127    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2128    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2129    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2130    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2131    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2132    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2133    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2134    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2135    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2136    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2137    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2138    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2139    12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2140    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128,
2141    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2142    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2143    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2144    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2145    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2146    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2147    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2148    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
2149];
2150
2151/// Padded base32 encoding
2152///
2153/// This encoding is a static version of:
2154///
2155/// ```rust
2156/// # use data_encoding::{Specification, BASE32};
2157/// let mut spec = Specification::new();
2158/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2159/// spec.padding = Some('=');
2160/// assert_eq!(BASE32, spec.encoding().unwrap());
2161/// ```
2162///
2163/// It conforms to [RFC4648].
2164///
2165/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-6
2166pub const BASE32: Encoding = Encoding::internal_new(BASE32_IMPL);
2167const BASE32_IMPL: &[u8] = &[
2168    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2169    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2170    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2171    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2172    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2173    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2174    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2175    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2176    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2177    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2178    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2179    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2180    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2181    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 130, 128, 128,
2182    128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2183    25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2184    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2185    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2186    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2187    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2188    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2189    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2190    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2191    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2192];
2193
2194/// Unpadded base32 encoding
2195///
2196/// This encoding is a static version of:
2197///
2198/// ```rust
2199/// # use data_encoding::{Specification, BASE32_NOPAD};
2200/// let mut spec = Specification::new();
2201/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2202/// assert_eq!(BASE32_NOPAD, spec.encoding().unwrap());
2203/// ```
2204pub const BASE32_NOPAD: Encoding = Encoding::internal_new(BASE32_NOPAD_IMPL);
2205const BASE32_NOPAD_IMPL: &[u8] = &[
2206    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2207    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2208    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2209    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2210    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2211    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2212    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2213    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2214    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2215    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2216    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2217    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2218    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2219    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2220    128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2221    25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2222    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2223    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2224    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2225    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2226    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2227    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2228    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2229    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2230];
2231
2232/// Unpadded base32 encoding with case-insensitive decoding
2233///
2234/// This encoding is a static version of:
2235///
2236/// ```rust
2237/// # use data_encoding::{Specification, BASE32_NOPAD_NOCASE};
2238/// let mut spec = Specification::new();
2239/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2240/// spec.translate.from.push_str("abcdefghijklmnopqrstuvwxyz");
2241/// spec.translate.to.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2242/// assert_eq!(BASE32_NOPAD_NOCASE, spec.encoding().unwrap());
2243/// ```
2244pub const BASE32_NOPAD_NOCASE: Encoding = Encoding::internal_new(BASE32_NOPAD_NOCASE_IMPL);
2245const BASE32_NOPAD_NOCASE_IMPL: &[u8] = &[
2246    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2247    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2248    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2249    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2250    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2251    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2252    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2253    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2254    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2255    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2256    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2257    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2258    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2259    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2260    128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
2261    25, 128, 128, 128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
2262    18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2263    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2264    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2265    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2266    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2267    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2268    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2269    128, 128, 128, 128, 128, 128, 128, 128, 29,
2270];
2271
2272/// Unpadded base32 encoding with visual error correction during decoding
2273///
2274/// This encoding is a static version of:
2275///
2276/// ```rust
2277/// # use data_encoding::{Specification, BASE32_NOPAD_VISUAL};
2278/// let mut spec = Specification::new();
2279/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2280/// spec.translate.from.push_str("01l8");
2281/// spec.translate.to.push_str("OIIB");
2282/// assert_eq!(BASE32_NOPAD_VISUAL, spec.encoding().unwrap());
2283/// ```
2284pub const BASE32_NOPAD_VISUAL: Encoding = Encoding::internal_new(BASE32_NOPAD_VISUAL_IMPL);
2285const BASE32_NOPAD_VISUAL_IMPL: &[u8] = &[
2286    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2287    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2288    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2289    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2290    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2291    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2292    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2293    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2294    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2295    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2296    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2297    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2298    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2299    128, 128, 128, 128, 14, 8, 26, 27, 28, 29, 30, 31, 1, 128, 128, 128, 128, 128, 128, 128, 128,
2300    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2301    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 8, 128,
2302    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2303    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2304    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2305    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2306    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2307    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2308    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2309    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2310];
2311
2312/// Padded base32hex encoding
2313///
2314/// This encoding is a static version of:
2315///
2316/// ```rust
2317/// # use data_encoding::{Specification, BASE32HEX};
2318/// let mut spec = Specification::new();
2319/// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2320/// spec.padding = Some('=');
2321/// assert_eq!(BASE32HEX, spec.encoding().unwrap());
2322/// ```
2323///
2324/// It conforms to [RFC4648].
2325///
2326/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-7
2327pub const BASE32HEX: Encoding = Encoding::internal_new(BASE32HEX_IMPL);
2328const BASE32HEX_IMPL: &[u8] = &[
2329    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2330    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2331    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2332    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2333    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2334    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2335    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2336    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2337    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2338    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2339    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2340    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2341    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2342    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 130, 128, 128, 128, 10, 11,
2343    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2344    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2345    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2346    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2347    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2348    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2349    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2350    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2351    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2352    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2353];
2354
2355/// Unpadded base32hex encoding
2356///
2357/// This encoding is a static version of:
2358///
2359/// ```rust
2360/// # use data_encoding::{Specification, BASE32HEX_NOPAD};
2361/// let mut spec = Specification::new();
2362/// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2363/// assert_eq!(BASE32HEX_NOPAD, spec.encoding().unwrap());
2364/// ```
2365pub const BASE32HEX_NOPAD: Encoding = Encoding::internal_new(BASE32HEX_NOPAD_IMPL);
2366const BASE32HEX_NOPAD_IMPL: &[u8] = &[
2367    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2368    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2369    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2370    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2371    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2372    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2373    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2374    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2375    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2376    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2377    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2378    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2379    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2380    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2381    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2382    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2383    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2384    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2385    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2386    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2387    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2388    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2389    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2390    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2391];
2392
2393/// DNSSEC base32 encoding
2394///
2395/// This encoding is a static version of:
2396///
2397/// ```rust
2398/// # use data_encoding::{Specification, BASE32_DNSSEC};
2399/// let mut spec = Specification::new();
2400/// spec.symbols.push_str("0123456789abcdefghijklmnopqrstuv");
2401/// spec.translate.from.push_str("ABCDEFGHIJKLMNOPQRSTUV");
2402/// spec.translate.to.push_str("abcdefghijklmnopqrstuv");
2403/// assert_eq!(BASE32_DNSSEC, spec.encoding().unwrap());
2404/// ```
2405///
2406/// It conforms to [RFC5155]:
2407///
2408/// - It uses a base32 extended hex alphabet.
2409/// - It is case-insensitive when decoding and uses lowercase when encoding.
2410/// - It does not use padding.
2411///
2412/// [RFC5155]: https://tools.ietf.org/html/rfc5155
2413pub const BASE32_DNSSEC: Encoding = Encoding::internal_new(BASE32_DNSSEC_IMPL);
2414const BASE32_DNSSEC_IMPL: &[u8] = &[
2415    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
2416    108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2417    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2418    116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104,
2419    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53,
2420    54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
2421    113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101,
2422    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49,
2423    50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
2424    110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98,
2425    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2426    118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
2427    107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 128, 128, 128, 128, 128, 128, 128,
2428    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2429    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2430    128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13,
2431    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128,
2432    128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2433    26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2434    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2435    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2436    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2437    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2438    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2439    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2440    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2441];
2442
2443#[allow(clippy::doc_markdown)]
2444/// DNSCurve base32 encoding
2445///
2446/// This encoding is a static version of:
2447///
2448/// ```rust
2449/// # use data_encoding::{BitOrder, Specification, BASE32_DNSCURVE};
2450/// let mut spec = Specification::new();
2451/// spec.symbols.push_str("0123456789bcdfghjklmnpqrstuvwxyz");
2452/// spec.bit_order = BitOrder::LeastSignificantFirst;
2453/// spec.translate.from.push_str("BCDFGHJKLMNPQRSTUVWXYZ");
2454/// spec.translate.to.push_str("bcdfghjklmnpqrstuvwxyz");
2455/// assert_eq!(BASE32_DNSCURVE, spec.encoding().unwrap());
2456/// ```
2457///
2458/// It conforms to [DNSCurve].
2459///
2460/// [DNSCurve]: https://dnscurve.org/in-implement.html
2461pub const BASE32_DNSCURVE: Encoding = Encoding::internal_new(BASE32_DNSCURVE_IMPL);
2462const BASE32_DNSCURVE_IMPL: &[u8] = &[
2463    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110,
2464    112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2465    98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119,
2466    120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107,
2467    108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53,
2468    54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116,
2469    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103,
2470    104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49,
2471    50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113,
2472    114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99,
2473    100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
2474    122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109,
2475    110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 128, 128, 128, 128, 128, 128,
2476    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2477    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2478    128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2479    12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
2480    128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128,
2481    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2482    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2483    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2484    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2485    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2486    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2487    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2488    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 21,
2489];
2490
2491/// Padded base64 encoding
2492///
2493/// This encoding is a static version of:
2494///
2495/// ```rust
2496/// # use data_encoding::{Specification, BASE64};
2497/// let mut spec = Specification::new();
2498/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2499/// spec.padding = Some('=');
2500/// assert_eq!(BASE64, spec.encoding().unwrap());
2501/// ```
2502///
2503/// It conforms to [RFC4648].
2504///
2505/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-4
2506pub const BASE64: Encoding = Encoding::internal_new(BASE64_IMPL);
2507const BASE64_IMPL: &[u8] = &[
2508    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2509    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2510    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2511    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2512    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2513    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2514    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2515    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2516    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2517    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2518    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2519    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2520    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2521    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2522    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2523    128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2524    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2525    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2526    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2527    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2528    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2529    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2530    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2531    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2532    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2533];
2534
2535/// Unpadded base64 encoding
2536///
2537/// This encoding is a static version of:
2538///
2539/// ```rust
2540/// # use data_encoding::{Specification, BASE64_NOPAD};
2541/// let mut spec = Specification::new();
2542/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2543/// assert_eq!(BASE64_NOPAD, spec.encoding().unwrap());
2544/// ```
2545pub const BASE64_NOPAD: Encoding = Encoding::internal_new(BASE64_NOPAD_IMPL);
2546const BASE64_NOPAD_IMPL: &[u8] = &[
2547    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2548    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2549    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2550    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2551    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2552    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2553    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2554    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2555    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2556    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2557    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2558    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2559    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2560    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2561    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2562    128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2563    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2564    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2565    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2566    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2567    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2568    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2569    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2570    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2571    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2572];
2573
2574/// MIME base64 encoding
2575///
2576/// This encoding is a static version of:
2577///
2578/// ```rust
2579/// # use data_encoding::{Specification, BASE64_MIME};
2580/// let mut spec = Specification::new();
2581/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2582/// spec.padding = Some('=');
2583/// spec.wrap.width = 76;
2584/// spec.wrap.separator.push_str("\r\n");
2585/// assert_eq!(BASE64_MIME, spec.encoding().unwrap());
2586/// ```
2587///
2588/// It does not exactly conform to [RFC2045] because it does not print the header
2589/// and does not ignore all characters.
2590///
2591/// [RFC2045]: https://tools.ietf.org/html/rfc2045
2592pub const BASE64_MIME: Encoding = Encoding::internal_new(BASE64_MIME_IMPL);
2593const BASE64_MIME_IMPL: &[u8] = &[
2594    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2595    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2596    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2597    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2598    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2599    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2600    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2601    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2602    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2603    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2604    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2605    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2606    128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2607    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2608    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2609    128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2610    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2611    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2612    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2613    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2614    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2615    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2616    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2617    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2618    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30, 76, 13, 10,
2619];
2620
2621/// MIME base64 encoding without trailing bits check
2622///
2623/// This encoding is a static version of:
2624///
2625/// ```rust
2626/// # use data_encoding::{Specification, BASE64_MIME_PERMISSIVE};
2627/// let mut spec = Specification::new();
2628/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2629/// spec.padding = Some('=');
2630/// spec.wrap.width = 76;
2631/// spec.wrap.separator.push_str("\r\n");
2632/// spec.check_trailing_bits = false;
2633/// assert_eq!(BASE64_MIME_PERMISSIVE, spec.encoding().unwrap());
2634/// ```
2635///
2636/// It does not exactly conform to [RFC2045] because it does not print the header
2637/// and does not ignore all characters.
2638///
2639/// [RFC2045]: https://tools.ietf.org/html/rfc2045
2640pub const BASE64_MIME_PERMISSIVE: Encoding = Encoding::internal_new(BASE64_MIME_PERMISSIVE_IMPL);
2641const BASE64_MIME_PERMISSIVE_IMPL: &[u8] = &[
2642    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2643    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2644    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2645    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2646    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2647    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2648    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2649    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2650    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2651    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2652    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2653    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2654    128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2655    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2656    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2657    128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2658    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2659    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2660    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2661    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2662    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2663    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2664    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2665    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2666    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 14, 76, 13, 10,
2667];
2668
2669/// Padded base64url encoding
2670///
2671/// This encoding is a static version of:
2672///
2673/// ```rust
2674/// # use data_encoding::{Specification, BASE64URL};
2675/// let mut spec = Specification::new();
2676/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2677/// spec.padding = Some('=');
2678/// assert_eq!(BASE64URL, spec.encoding().unwrap());
2679/// ```
2680///
2681/// It conforms to [RFC4648].
2682///
2683/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-5
2684pub const BASE64URL: Encoding = Encoding::internal_new(BASE64URL_IMPL);
2685const BASE64URL_IMPL: &[u8] = &[
2686    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2687    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2688    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2689    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2690    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2691    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2692    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2693    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2694    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2695    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2696    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2697    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2698    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2699    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2700    128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2701    128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2702    24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2703    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2704    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2705    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2706    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2707    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2708    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2709    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2710    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2711];
2712
2713/// Unpadded base64url encoding
2714///
2715/// This encoding is a static version of:
2716///
2717/// ```rust
2718/// # use data_encoding::{Specification, BASE64URL_NOPAD};
2719/// let mut spec = Specification::new();
2720/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2721/// assert_eq!(BASE64URL_NOPAD, spec.encoding().unwrap());
2722/// ```
2723pub const BASE64URL_NOPAD: Encoding = Encoding::internal_new(BASE64URL_NOPAD_IMPL);
2724const BASE64URL_NOPAD_IMPL: &[u8] = &[
2725    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2726    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2727    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2728    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2729    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2730    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2731    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2732    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2733    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2734    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2735    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2736    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2737    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2738    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2739    128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2740    128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
2741    24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2742    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2743    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2744    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2745    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2746    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2747    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2748    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2749    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2750];