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_auto_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    /// [`encode_mut`]: struct.Encoding.html#method.encode_mut
1260    #[must_use]
1261    pub fn encode_len(&self, len: usize) -> usize {
1262        dispatch! {
1263            let bit: usize = self.bit();
1264            let pad: Option<u8> = self.pad();
1265            let wrap: Option<(usize, &[u8])> = self.wrap();
1266            encode_wrap_len(bit, pad, wrap, len)
1267        }
1268    }
1269
1270    /// Encodes `input` in `output`
1271    ///
1272    /// # Panics
1273    ///
1274    /// Panics if the `output` length does not match the result of [`encode_len`] for the `input`
1275    /// length.
1276    ///
1277    /// # Examples
1278    ///
1279    /// ```rust
1280    /// use data_encoding::BASE64;
1281    /// # let mut buffer = vec![0; 100];
1282    /// let input = b"Hello world";
1283    /// let output = &mut buffer[0 .. BASE64.encode_len(input.len())];
1284    /// BASE64.encode_mut(input, output);
1285    /// assert_eq!(output, b"SGVsbG8gd29ybGQ=");
1286    /// ```
1287    ///
1288    /// [`encode_len`]: struct.Encoding.html#method.encode_len
1289    #[allow(clippy::cognitive_complexity)]
1290    pub fn encode_mut(&self, input: &[u8], output: &mut [u8]) {
1291        assert_eq!(output.len(), self.encode_len(input.len()));
1292        dispatch! {
1293            let bit: usize = self.bit();
1294            let msb: bool = self.msb();
1295            let pad: Option<u8> = self.pad();
1296            let wrap: Option<(usize, &[u8])> = self.wrap();
1297            encode_wrap_mut(bit, msb, self.sym(), pad, wrap, input, output)
1298        }
1299    }
1300
1301    /// Encodes `input` in `output` and returns it as a `&str`
1302    ///
1303    /// It is guaranteed that `output` and the return value only differ by their type. They both
1304    /// point to the same range of memory (pointer and length).
1305    ///
1306    /// # Panics
1307    ///
1308    /// Panics if the `output` length does not match the result of [`encode_len`] for the `input`
1309    /// length.
1310    ///
1311    /// # Examples
1312    ///
1313    /// ```rust
1314    /// use data_encoding::BASE64;
1315    /// # let mut buffer = vec![0; 100];
1316    /// let input = b"Hello world";
1317    /// let output = &mut buffer[0 .. BASE64.encode_len(input.len())];
1318    /// assert_eq!(BASE64.encode_mut_str(input, output), "SGVsbG8gd29ybGQ=");
1319    /// ```
1320    ///
1321    /// [`encode_len`]: struct.Encoding.html#method.encode_len
1322    pub fn encode_mut_str<'a>(&self, input: &[u8], output: &'a mut [u8]) -> &'a str {
1323        self.encode_mut(input, output);
1324        safety_assert!(output.is_ascii());
1325        // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1326        unsafe { core::str::from_utf8_unchecked(output) }
1327    }
1328
1329    /// Appends the encoding of `input` to `output`
1330    ///
1331    /// # Examples
1332    ///
1333    /// ```rust
1334    /// use data_encoding::BASE64;
1335    /// # let mut buffer = vec![0; 100];
1336    /// let input = b"Hello world";
1337    /// let mut output = "Result: ".to_string();
1338    /// BASE64.encode_append(input, &mut output);
1339    /// assert_eq!(output, "Result: SGVsbG8gd29ybGQ=");
1340    /// ```
1341    #[cfg(feature = "alloc")]
1342    pub fn encode_append(&self, input: &[u8], output: &mut String) {
1343        // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted below).
1344        let output = unsafe { output.as_mut_vec() };
1345        let output_len = output.len();
1346        output.resize(output_len + self.encode_len(input.len()), 0u8);
1347        self.encode_mut(input, &mut output[output_len ..]);
1348        safety_assert!(output[output_len ..].is_ascii());
1349    }
1350
1351    /// Returns an object to encode a fragmented input and append it to `output`
1352    ///
1353    /// See the documentation of [`Encoder`] for more details and examples.
1354    #[cfg(feature = "alloc")]
1355    pub fn new_encoder<'a>(&'a self, output: &'a mut String) -> Encoder<'a> {
1356        Encoder::new(self, output)
1357    }
1358
1359    /// Writes the encoding of `input` to `output`
1360    ///
1361    /// This allocates a buffer of 1024 bytes on the stack. If you want to control the buffer size
1362    /// and location, use [`Encoding::encode_write_buffer()`] instead.
1363    ///
1364    /// # Errors
1365    ///
1366    /// Returns an error when writing to the output fails.
1367    pub fn encode_write(
1368        &self, input: &[u8], output: &mut impl core::fmt::Write,
1369    ) -> core::fmt::Result {
1370        self.encode_write_buffer(input, output, &mut [0; 1024])
1371    }
1372
1373    /// Writes the encoding of `input` to `output` using a temporary `buffer`
1374    ///
1375    /// # Panics
1376    ///
1377    /// Panics if the buffer is shorter than 510 bytes.
1378    ///
1379    /// # Errors
1380    ///
1381    /// Returns an error when writing to the output fails.
1382    pub fn encode_write_buffer(
1383        &self, input: &[u8], output: &mut impl core::fmt::Write, buffer: &mut [u8],
1384    ) -> core::fmt::Result {
1385        assert!(510 <= buffer.len());
1386        let (enc, dec) = self.block_len();
1387        for input in input.chunks(buffer.len() / dec * enc) {
1388            let buffer = &mut buffer[.. self.encode_len(input.len())];
1389            self.encode_mut(input, buffer);
1390            safety_assert!(buffer.is_ascii());
1391            // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1392            output.write_str(unsafe { core::str::from_utf8_unchecked(buffer) })?;
1393        }
1394        Ok(())
1395    }
1396
1397    /// Returns an object to display the encoding of `input`
1398    ///
1399    /// # Examples
1400    ///
1401    /// ```rust
1402    /// use data_encoding::BASE64;
1403    /// assert_eq!(
1404    ///     format!("Payload: {}", BASE64.encode_display(b"Hello world")),
1405    ///     "Payload: SGVsbG8gd29ybGQ=",
1406    /// );
1407    /// ```
1408    #[must_use]
1409    pub fn encode_display<'a>(&'a self, input: &'a [u8]) -> Display<'a> {
1410        Display { encoding: self, input }
1411    }
1412
1413    /// Returns encoded `input`
1414    ///
1415    /// # Examples
1416    ///
1417    /// ```rust
1418    /// use data_encoding::BASE64;
1419    /// assert_eq!(BASE64.encode(b"Hello world"), "SGVsbG8gd29ybGQ=");
1420    /// ```
1421    #[cfg(feature = "alloc")]
1422    #[must_use]
1423    pub fn encode(&self, input: &[u8]) -> String {
1424        let mut output = vec![0u8; self.encode_len(input.len())];
1425        self.encode_mut(input, &mut output);
1426        safety_assert!(output.is_ascii());
1427        // SAFETY: Ensured by correctness guarantees of encode_mut (and asserted above).
1428        unsafe { String::from_utf8_unchecked(output) }
1429    }
1430
1431    /// Returns the maximum decoded length of an input of length `len`
1432    ///
1433    /// See [`decode_mut`] for when to use it. In particular, the actual decoded length might be
1434    /// smaller if the actual input contains padding or ignored characters.
1435    ///
1436    /// # Errors
1437    ///
1438    /// Returns an error if `len` is invalid. The error kind is [`Length`] and the [position] is the
1439    /// greatest valid input length.
1440    ///
1441    /// [`decode_mut`]: struct.Encoding.html#method.decode_mut
1442    /// [`Length`]: enum.DecodeKind.html#variant.Length
1443    /// [position]: struct.DecodeError.html#structfield.position
1444    pub fn decode_len(&self, len: usize) -> Result<usize, DecodeError> {
1445        let (ilen, olen) = dispatch! {
1446            let bit: usize = self.bit();
1447            let pad: bool = self.pad().is_some();
1448            decode_wrap_len(bit, pad, len)
1449        };
1450        check!(
1451            DecodeError { position: ilen, kind: DecodeKind::Length },
1452            self.has_ignore() || len == ilen
1453        );
1454        Ok(olen)
1455    }
1456
1457    /// Decodes `input` in `output`
1458    ///
1459    /// Returns the length of the decoded output. This length may be smaller than the output length
1460    /// if the input contained padding or ignored characters. The output bytes after the returned
1461    /// length are not initialized and should not be read.
1462    ///
1463    /// # Panics
1464    ///
1465    /// Panics if the `output` length does not match the result of [`decode_len`] for the `input`
1466    /// length. Also panics if `decode_len` fails for the `input` length.
1467    ///
1468    /// # Errors
1469    ///
1470    /// Returns an error if `input` is invalid. See [`decode`] for more details. The are two
1471    /// differences though:
1472    ///
1473    /// - [`Length`] may be returned only if the encoding allows ignored characters, because
1474    ///   otherwise this is already checked by [`decode_len`].
1475    /// - The [`read`] first bytes of the input have been successfully decoded to the [`written`]
1476    ///   first bytes of the output.
1477    ///
1478    /// # Examples
1479    ///
1480    /// ```rust
1481    /// use data_encoding::BASE64;
1482    /// # let mut buffer = vec![0; 100];
1483    /// let input = b"SGVsbA==byB3b3JsZA==";
1484    /// let output = &mut buffer[0 .. BASE64.decode_len(input.len()).unwrap()];
1485    /// let len = BASE64.decode_mut(input, output).unwrap();
1486    /// assert_eq!(&output[0 .. len], b"Hello world");
1487    /// ```
1488    ///
1489    /// [`decode_len`]: struct.Encoding.html#method.decode_len
1490    /// [`decode`]: struct.Encoding.html#method.decode
1491    /// [`Length`]: enum.DecodeKind.html#variant.Length
1492    /// [`read`]: struct.DecodePartial.html#structfield.read
1493    /// [`written`]: struct.DecodePartial.html#structfield.written
1494    #[allow(clippy::cognitive_complexity)]
1495    pub fn decode_mut(&self, input: &[u8], output: &mut [u8]) -> Result<usize, DecodePartial> {
1496        assert_eq!(Ok(output.len()), self.decode_len(input.len()));
1497        dispatch! {
1498            let bit: usize = self.bit();
1499            let msb: bool = self.msb();
1500            let pad: bool = self.pad().is_some();
1501            let has_ignore: bool = self.has_ignore();
1502            decode_wrap_mut(bit, msb, self.ctb(), self.val(), pad, has_ignore,
1503                            input, output)
1504        }
1505    }
1506
1507    /// Returns decoded `input`
1508    ///
1509    /// # Errors
1510    ///
1511    /// Returns an error if `input` is invalid. The error kind can be:
1512    ///
1513    /// - [`Length`] if the input length is invalid. The [position] is the greatest valid input
1514    ///   length.
1515    /// - [`Symbol`] if the input contains an invalid character. The [position] is the first invalid
1516    ///   character.
1517    /// - [`Trailing`] if the input has non-zero trailing bits. This is only possible if the
1518    ///   encoding checks trailing bits. The [position] is the first character containing non-zero
1519    ///   trailing bits.
1520    /// - [`Padding`] if the input has an invalid padding length. This is only possible if the
1521    ///   encoding uses padding. The [position] is the first padding character of the first padding
1522    ///   of invalid length.
1523    ///
1524    /// # Examples
1525    ///
1526    /// ```rust
1527    /// use data_encoding::BASE64;
1528    /// assert_eq!(BASE64.decode(b"SGVsbA==byB3b3JsZA==").unwrap(), b"Hello world");
1529    /// ```
1530    ///
1531    /// [`Length`]: enum.DecodeKind.html#variant.Length
1532    /// [`Symbol`]: enum.DecodeKind.html#variant.Symbol
1533    /// [`Trailing`]: enum.DecodeKind.html#variant.Trailing
1534    /// [`Padding`]: enum.DecodeKind.html#variant.Padding
1535    /// [position]: struct.DecodeError.html#structfield.position
1536    #[cfg(feature = "alloc")]
1537    pub fn decode(&self, input: &[u8]) -> Result<Vec<u8>, DecodeError> {
1538        let mut output = vec![0u8; self.decode_len(input.len())?];
1539        let len = self.decode_mut(input, &mut output).map_err(|partial| partial.error)?;
1540        output.truncate(len);
1541        Ok(output)
1542    }
1543
1544    /// Returns the bit-width
1545    #[must_use]
1546    pub fn bit_width(&self) -> usize {
1547        self.bit()
1548    }
1549
1550    /// Returns whether the encoding is canonical
1551    ///
1552    /// An encoding is not canonical if one of the following conditions holds:
1553    ///
1554    /// - trailing bits are not checked
1555    /// - padding is used
1556    /// - characters are ignored
1557    /// - characters are translated
1558    #[must_use]
1559    pub fn is_canonical(&self) -> bool {
1560        if !self.ctb() {
1561            return false;
1562        }
1563        let bit = self.bit();
1564        let sym = self.sym();
1565        let val = self.val();
1566        for i in 0 .. 256 {
1567            if val[i] == INVALID {
1568                continue;
1569            }
1570            if val[i] >= 1 << bit {
1571                return false;
1572            }
1573            if sym[val[i] as usize] as usize != i {
1574                return false;
1575            }
1576        }
1577        true
1578    }
1579
1580    /// Returns the encoding specification
1581    #[allow(clippy::missing_panics_doc)] // no panic
1582    #[cfg(feature = "alloc")]
1583    #[must_use]
1584    pub fn specification(&self) -> Specification {
1585        let mut specification = Specification::new();
1586        specification
1587            .symbols
1588            .push_str(core::str::from_utf8(&self.sym()[0 .. 1 << self.bit()]).unwrap());
1589        specification.bit_order =
1590            if self.msb() { MostSignificantFirst } else { LeastSignificantFirst };
1591        specification.check_trailing_bits = self.ctb();
1592        if let Some(pad) = self.pad() {
1593            specification.padding = Some(pad as char);
1594        }
1595        for i in 0 .. 128u8 {
1596            if self.val()[i as usize] != IGNORE {
1597                continue;
1598            }
1599            specification.ignore.push(i as char);
1600        }
1601        if let Some((col, end)) = self.wrap() {
1602            specification.wrap.width = col;
1603            specification.wrap.separator = core::str::from_utf8(end).unwrap().to_owned();
1604        }
1605        for i in 0 .. 128u8 {
1606            let canonical = if self.val()[i as usize] < 1 << self.bit() {
1607                self.sym()[self.val()[i as usize] as usize]
1608            } else if self.val()[i as usize] == PADDING {
1609                self.pad().unwrap()
1610            } else {
1611                continue;
1612            };
1613            if i == canonical {
1614                continue;
1615            }
1616            specification.translate.from.push(i as char);
1617            specification.translate.to.push(canonical as char);
1618        }
1619        specification
1620    }
1621
1622    #[doc(hidden)]
1623    #[must_use]
1624    pub const fn internal_new(implementation: &'static [u8]) -> Encoding {
1625        #[cfg(feature = "alloc")]
1626        let encoding = Encoding(Cow::Borrowed(implementation));
1627        #[cfg(not(feature = "alloc"))]
1628        let encoding = Encoding(implementation);
1629        encoding
1630    }
1631
1632    #[doc(hidden)]
1633    #[must_use]
1634    pub fn internal_implementation(&self) -> &[u8] {
1635        &self.0
1636    }
1637}
1638
1639/// Encodes fragmented input to an output
1640///
1641/// It is equivalent to use an [`Encoder`] with multiple calls to [`Encoder::append()`] than to
1642/// first concatenate all the input and then use [`Encoding::encode_append()`]. In particular, this
1643/// function will not introduce padding or wrapping between inputs.
1644///
1645/// # Examples
1646///
1647/// ```rust
1648/// // This is a bit inconvenient but we can't take a long-term reference to data_encoding::BASE64
1649/// // because it's a constant. We need to use a static which has an address instead. This will be
1650/// // fixed in version 3 of the library.
1651/// static BASE64: data_encoding::Encoding = data_encoding::BASE64;
1652/// let mut output = String::new();
1653/// let mut encoder = BASE64.new_encoder(&mut output);
1654/// encoder.append(b"hello");
1655/// encoder.append(b"world");
1656/// encoder.finalize();
1657/// assert_eq!(output, BASE64.encode(b"helloworld"));
1658/// ```
1659#[derive(Debug)]
1660#[cfg(feature = "alloc")]
1661pub struct Encoder<'a> {
1662    encoding: &'a Encoding,
1663    output: &'a mut String,
1664    buffer: [u8; 255],
1665    length: u8,
1666}
1667
1668#[cfg(feature = "alloc")]
1669impl Drop for Encoder<'_> {
1670    fn drop(&mut self) {
1671        self.encoding.encode_append(&self.buffer[.. self.length as usize], self.output);
1672    }
1673}
1674
1675#[cfg(feature = "alloc")]
1676impl<'a> Encoder<'a> {
1677    fn new(encoding: &'a Encoding, output: &'a mut String) -> Self {
1678        Encoder { encoding, output, buffer: [0; 255], length: 0 }
1679    }
1680
1681    /// Encodes the provided input fragment and appends the result to the output
1682    pub fn append(&mut self, mut input: &[u8]) {
1683        #[allow(clippy::cast_possible_truncation)] // no truncation
1684        let max = self.encoding.block_len().0 as u8;
1685        if self.length != 0 {
1686            let len = self.length;
1687            #[allow(clippy::cast_possible_truncation)] // no truncation
1688            let add = core::cmp::min((max - len) as usize, input.len()) as u8;
1689            self.buffer[len as usize ..][.. add as usize].copy_from_slice(&input[.. add as usize]);
1690            self.length += add;
1691            input = &input[add as usize ..];
1692            if self.length != max {
1693                debug_assert!(self.length < max);
1694                debug_assert!(input.is_empty());
1695                return;
1696            }
1697            self.encoding.encode_append(&self.buffer[.. max as usize], self.output);
1698            self.length = 0;
1699        }
1700        let len = floor(input.len(), max as usize);
1701        self.encoding.encode_append(&input[.. len], self.output);
1702        input = &input[len ..];
1703        #[allow(clippy::cast_possible_truncation)] // no truncation
1704        let len = input.len() as u8;
1705        self.buffer[.. len as usize].copy_from_slice(input);
1706        self.length = len;
1707    }
1708
1709    /// Makes sure all inputs have been encoded and appended to the output
1710    ///
1711    /// This is equivalent to dropping the encoder and required for correctness, otherwise some
1712    /// encoded data may be missing at the end.
1713    pub fn finalize(self) {}
1714}
1715
1716/// Wraps an encoding and input for display purposes.
1717#[derive(Debug)]
1718pub struct Display<'a> {
1719    encoding: &'a Encoding,
1720    input: &'a [u8],
1721}
1722
1723impl core::fmt::Display for Display<'_> {
1724    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1725        self.encoding.encode_write(self.input, f)
1726    }
1727}
1728
1729#[derive(Debug, Copy, Clone)]
1730#[cfg(feature = "alloc")]
1731enum SpecificationErrorImpl {
1732    BadSize,
1733    NotAscii,
1734    Duplicate(u8),
1735    ExtraPadding,
1736    WrapLength,
1737    WrapWidth(u8),
1738    FromTo,
1739    Undefined(u8),
1740}
1741#[cfg(feature = "alloc")]
1742use crate::SpecificationErrorImpl::*;
1743
1744/// Specification error
1745#[derive(Debug, Copy, Clone)]
1746#[cfg(feature = "alloc")]
1747pub struct SpecificationError(SpecificationErrorImpl);
1748
1749#[cfg(feature = "alloc")]
1750impl core::fmt::Display for SpecificationError {
1751    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1752        match self.0 {
1753            BadSize => write!(f, "invalid number of symbols"),
1754            NotAscii => write!(f, "non-ascii character"),
1755            Duplicate(c) => write!(f, "{:?} has conflicting definitions", c as char),
1756            ExtraPadding => write!(f, "unnecessary padding"),
1757            WrapLength => write!(f, "invalid wrap width or separator length"),
1758            WrapWidth(x) => write!(f, "wrap width not a multiple of {}", x),
1759            FromTo => write!(f, "translate from/to length mismatch"),
1760            Undefined(c) => write!(f, "{:?} is undefined", c as char),
1761        }
1762    }
1763}
1764
1765#[cfg(feature = "std")]
1766impl std::error::Error for SpecificationError {
1767    fn description(&self) -> &str {
1768        match self.0 {
1769            BadSize => "invalid number of symbols",
1770            NotAscii => "non-ascii character",
1771            Duplicate(_) => "conflicting definitions",
1772            ExtraPadding => "unnecessary padding",
1773            WrapLength => "invalid wrap width or separator length",
1774            WrapWidth(_) => "wrap width not a multiple",
1775            FromTo => "translate from/to length mismatch",
1776            Undefined(_) => "undefined character",
1777        }
1778    }
1779}
1780
1781#[cfg(feature = "alloc")]
1782impl Specification {
1783    /// Returns a default specification
1784    #[must_use]
1785    pub fn new() -> Specification {
1786        Specification {
1787            symbols: String::new(),
1788            bit_order: MostSignificantFirst,
1789            check_trailing_bits: true,
1790            padding: None,
1791            ignore: String::new(),
1792            wrap: Wrap { width: 0, separator: String::new() },
1793            translate: Translate { from: String::new(), to: String::new() },
1794        }
1795    }
1796
1797    /// Returns the specified encoding
1798    ///
1799    /// # Errors
1800    ///
1801    /// Returns an error if the specification is invalid.
1802    pub fn encoding(&self) -> Result<Encoding, SpecificationError> {
1803        let symbols = self.symbols.as_bytes();
1804        let bit: u8 = match symbols.len() {
1805            2 => 1,
1806            4 => 2,
1807            8 => 3,
1808            16 => 4,
1809            32 => 5,
1810            64 => 6,
1811            _ => return Err(SpecificationError(BadSize)),
1812        };
1813        let mut values = [INVALID; 128];
1814        let set = |v: &mut [u8; 128], i: u8, x: u8| {
1815            check!(SpecificationError(NotAscii), i < 128);
1816            if v[i as usize] == x {
1817                return Ok(());
1818            }
1819            check!(SpecificationError(Duplicate(i)), v[i as usize] == INVALID);
1820            v[i as usize] = x;
1821            Ok(())
1822        };
1823        for (v, symbols) in symbols.iter().enumerate() {
1824            #[allow(clippy::cast_possible_truncation)] // no truncation
1825            set(&mut values, *symbols, v as u8)?;
1826        }
1827        let msb = self.bit_order == MostSignificantFirst;
1828        let ctb = self.check_trailing_bits || 8 % bit == 0;
1829        let pad = match self.padding {
1830            None => None,
1831            Some(pad) => {
1832                check!(SpecificationError(ExtraPadding), 8 % bit != 0);
1833                check!(SpecificationError(NotAscii), pad.len_utf8() == 1);
1834                set(&mut values, pad as u8, PADDING)?;
1835                Some(pad as u8)
1836            }
1837        };
1838        for i in self.ignore.bytes() {
1839            set(&mut values, i, IGNORE)?;
1840        }
1841        let wrap = if self.wrap.separator.is_empty() || self.wrap.width == 0 {
1842            None
1843        } else {
1844            let col = self.wrap.width;
1845            let end = self.wrap.separator.as_bytes();
1846            check!(SpecificationError(WrapLength), col < 256 && end.len() < 256);
1847            #[allow(clippy::cast_possible_truncation)] // no truncation
1848            let col = col as u8;
1849            #[allow(clippy::cast_possible_truncation)] // no truncation
1850            let dec = dec(bit as usize) as u8;
1851            check!(SpecificationError(WrapWidth(dec)), col % dec == 0);
1852            for &i in end {
1853                set(&mut values, i, IGNORE)?;
1854            }
1855            Some((col, end))
1856        };
1857        let from = self.translate.from.as_bytes();
1858        let to = self.translate.to.as_bytes();
1859        check!(SpecificationError(FromTo), from.len() == to.len());
1860        for i in 0 .. from.len() {
1861            check!(SpecificationError(NotAscii), to[i] < 128);
1862            let v = values[to[i] as usize];
1863            check!(SpecificationError(Undefined(to[i])), v != INVALID);
1864            set(&mut values, from[i], v)?;
1865        }
1866        let mut encoding = Vec::new();
1867        for _ in 0 .. 256 / symbols.len() {
1868            encoding.extend_from_slice(symbols);
1869        }
1870        encoding.extend_from_slice(&values);
1871        encoding.extend_from_slice(&[INVALID; 128]);
1872        match pad {
1873            None => encoding.push(INVALID),
1874            Some(pad) => encoding.push(pad),
1875        }
1876        encoding.push(bit);
1877        if msb {
1878            encoding[513] |= 0x08;
1879        }
1880        if ctb {
1881            encoding[513] |= 0x10;
1882        }
1883        if let Some((col, end)) = wrap {
1884            encoding.push(col);
1885            encoding.extend_from_slice(end);
1886        } else if values.contains(&IGNORE) {
1887            encoding.push(0);
1888        }
1889        Ok(Encoding(Cow::Owned(encoding)))
1890    }
1891}
1892
1893/// Lowercase hexadecimal encoding
1894///
1895/// This encoding is a static version of:
1896///
1897/// ```rust
1898/// # use data_encoding::{Specification, HEXLOWER};
1899/// let mut spec = Specification::new();
1900/// spec.symbols.push_str("0123456789abcdef");
1901/// assert_eq!(HEXLOWER, spec.encoding().unwrap());
1902/// ```
1903///
1904/// # Examples
1905///
1906/// ```rust
1907/// use data_encoding::HEXLOWER;
1908/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1909/// assert_eq!(HEXLOWER.decode(b"deadbeef").unwrap(), deadbeef);
1910/// assert_eq!(HEXLOWER.encode(&deadbeef), "deadbeef");
1911/// ```
1912pub const HEXLOWER: Encoding = Encoding::internal_new(HEXLOWER_IMPL);
1913const HEXLOWER_IMPL: &[u8] = &[
1914    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1915    55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1916    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1917    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1918    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1919    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1920    56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1921    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1922    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1923    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1924    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1925    56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1926    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1927    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 1, 2,
1928    3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1929    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1930    128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1931    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1932    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1933    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1934    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1935    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1936    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1937    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1938    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1939];
1940
1941/// Lowercase hexadecimal encoding with case-insensitive decoding
1942///
1943/// This encoding is a static version of:
1944///
1945/// ```rust
1946/// # use data_encoding::{Specification, HEXLOWER_PERMISSIVE};
1947/// let mut spec = Specification::new();
1948/// spec.symbols.push_str("0123456789abcdef");
1949/// spec.translate.from.push_str("ABCDEF");
1950/// spec.translate.to.push_str("abcdef");
1951/// assert_eq!(HEXLOWER_PERMISSIVE, spec.encoding().unwrap());
1952/// ```
1953///
1954/// # Examples
1955///
1956/// ```rust
1957/// use data_encoding::HEXLOWER_PERMISSIVE;
1958/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
1959/// assert_eq!(HEXLOWER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
1960/// assert_eq!(HEXLOWER_PERMISSIVE.encode(&deadbeef), "deadbeef");
1961/// ```
1962///
1963/// You can also define a shorter name:
1964///
1965/// ```rust
1966/// use data_encoding::{Encoding, HEXLOWER_PERMISSIVE};
1967/// const HEX: Encoding = HEXLOWER_PERMISSIVE;
1968/// ```
1969pub const HEXLOWER_PERMISSIVE: Encoding = Encoding::internal_new(HEXLOWER_PERMISSIVE_IMPL);
1970const HEXLOWER_PERMISSIVE_IMPL: &[u8] = &[
1971    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54,
1972    55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1973    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1974    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1975    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1976    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1977    56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100,
1978    101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51,
1979    52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97,
1980    98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48,
1981    49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 48, 49, 50, 51, 52, 53, 54, 55,
1982    56, 57, 97, 98, 99, 100, 101, 102, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1983    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 0, 1, 2,
1985    3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 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, 10, 11, 12, 13, 14, 15, 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, 128, 128, 128, 128, 128, 128, 128,
1992    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1993    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1994    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
1995    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 28,
1996];
1997
1998/// Uppercase hexadecimal encoding
1999///
2000/// This encoding is a static version of:
2001///
2002/// ```rust
2003/// # use data_encoding::{Specification, HEXUPPER};
2004/// let mut spec = Specification::new();
2005/// spec.symbols.push_str("0123456789ABCDEF");
2006/// assert_eq!(HEXUPPER, spec.encoding().unwrap());
2007/// ```
2008///
2009/// It is compliant with [RFC4648] and known as "base16" or "hex".
2010///
2011/// # Examples
2012///
2013/// ```rust
2014/// use data_encoding::HEXUPPER;
2015/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
2016/// assert_eq!(HEXUPPER.decode(b"DEADBEEF").unwrap(), deadbeef);
2017/// assert_eq!(HEXUPPER.encode(&deadbeef), "DEADBEEF");
2018/// ```
2019///
2020/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-8
2021pub const HEXUPPER: Encoding = Encoding::internal_new(HEXUPPER_IMPL);
2022const HEXUPPER_IMPL: &[u8] = &[
2023    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2024    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2025    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2026    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2027    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2028    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2029    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2030    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2031    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2032    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2033    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 128, 128, 128, 128, 128, 128,
2034    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2035    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2036    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2037    12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2038    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 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, 28,
2047];
2048
2049/// Uppercase hexadecimal encoding with case-insensitive decoding
2050///
2051/// This encoding is a static version of:
2052///
2053/// ```rust
2054/// # use data_encoding::{Specification, HEXUPPER_PERMISSIVE};
2055/// let mut spec = Specification::new();
2056/// spec.symbols.push_str("0123456789ABCDEF");
2057/// spec.translate.from.push_str("abcdef");
2058/// spec.translate.to.push_str("ABCDEF");
2059/// assert_eq!(HEXUPPER_PERMISSIVE, spec.encoding().unwrap());
2060/// ```
2061///
2062/// # Examples
2063///
2064/// ```rust
2065/// use data_encoding::HEXUPPER_PERMISSIVE;
2066/// let deadbeef = vec![0xde, 0xad, 0xbe, 0xef];
2067/// assert_eq!(HEXUPPER_PERMISSIVE.decode(b"DeadBeef").unwrap(), deadbeef);
2068/// assert_eq!(HEXUPPER_PERMISSIVE.encode(&deadbeef), "DEADBEEF");
2069/// ```
2070pub const HEXUPPER_PERMISSIVE: Encoding = Encoding::internal_new(HEXUPPER_PERMISSIVE_IMPL);
2071const HEXUPPER_PERMISSIVE_IMPL: &[u8] = &[
2072    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2073    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2074    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55,
2075    56, 57, 65, 66, 67, 68, 69, 70, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
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, 128, 128, 128, 128, 128, 128,
2083    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2084    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2085    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2086    12, 13, 14, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2087    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2090    128, 128, 128, 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, 28,
2096];
2097
2098/// Padded base32 encoding
2099///
2100/// This encoding is a static version of:
2101///
2102/// ```rust
2103/// # use data_encoding::{Specification, BASE32};
2104/// let mut spec = Specification::new();
2105/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2106/// spec.padding = Some('=');
2107/// assert_eq!(BASE32, spec.encoding().unwrap());
2108/// ```
2109///
2110/// It conforms to [RFC4648].
2111///
2112/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-6
2113pub const BASE32: Encoding = Encoding::internal_new(BASE32_IMPL);
2114const BASE32_IMPL: &[u8] = &[
2115    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2116    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2117    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2118    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2119    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2120    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2121    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2122    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2123    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2124    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2125    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2126    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2127    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2128    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 130, 128, 128,
2129    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,
2130    25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2131    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2132    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2133    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2134    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2135    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2139];
2140
2141/// Unpadded base32 encoding
2142///
2143/// This encoding is a static version of:
2144///
2145/// ```rust
2146/// # use data_encoding::{Specification, BASE32_NOPAD};
2147/// let mut spec = Specification::new();
2148/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2149/// assert_eq!(BASE32_NOPAD, spec.encoding().unwrap());
2150/// ```
2151pub const BASE32_NOPAD: Encoding = Encoding::internal_new(BASE32_NOPAD_IMPL);
2152const BASE32_NOPAD_IMPL: &[u8] = &[
2153    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2154    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2155    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2156    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2157    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2158    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2159    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2160    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2161    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2162    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2163    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2164    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2165    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2166    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2167    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,
2168    25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2169    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2170    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2171    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2172    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2173    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2174    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2175    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2176    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2177];
2178
2179/// Unpadded base32 encoding with case-insensitive decoding
2180///
2181/// This encoding is a static version of:
2182///
2183/// ```rust
2184/// # use data_encoding::{Specification, BASE32_NOPAD_NOCASE};
2185/// let mut spec = Specification::new();
2186/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2187/// spec.translate.from.push_str("abcdefghijklmnopqrstuvwxyz");
2188/// spec.translate.to.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2189/// assert_eq!(BASE32_NOPAD_NOCASE, spec.encoding().unwrap());
2190/// ```
2191pub const BASE32_NOPAD_NOCASE: Encoding = Encoding::internal_new(BASE32_NOPAD_NOCASE_IMPL);
2192const BASE32_NOPAD_NOCASE_IMPL: &[u8] = &[
2193    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2194    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2195    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2196    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2197    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2198    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2199    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2200    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2201    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2202    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2203    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2204    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2205    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2206    128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128,
2207    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,
2208    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,
2209    18, 19, 20, 21, 22, 23, 24, 25, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2210    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2211    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2212    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2213    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2214    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2215    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2216    128, 128, 128, 128, 128, 128, 128, 128, 29,
2217];
2218
2219/// Unpadded base32 encoding with visual error correction during decoding
2220///
2221/// This encoding is a static version of:
2222///
2223/// ```rust
2224/// # use data_encoding::{Specification, BASE32_NOPAD_VISUAL};
2225/// let mut spec = Specification::new();
2226/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
2227/// spec.translate.from.push_str("01l8");
2228/// spec.translate.to.push_str("OIIB");
2229/// assert_eq!(BASE32_NOPAD_VISUAL, spec.encoding().unwrap());
2230/// ```
2231pub const BASE32_NOPAD_VISUAL: Encoding = Encoding::internal_new(BASE32_NOPAD_VISUAL_IMPL);
2232const BASE32_NOPAD_VISUAL_IMPL: &[u8] = &[
2233    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2234    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2235    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2236    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2237    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2238    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2239    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72,
2240    73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55,
2241    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2242    89, 90, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
2243    81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 50, 51, 52, 53, 54, 55, 128, 128, 128, 128, 128, 128,
2244    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2245    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2246    128, 128, 128, 128, 14, 8, 26, 27, 28, 29, 30, 31, 1, 128, 128, 128, 128, 128, 128, 128, 128,
2247    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,
2248    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 8, 128,
2249    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2250    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2251    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2252    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2253    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2254    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2255    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2256    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2257];
2258
2259/// Padded base32hex encoding
2260///
2261/// This encoding is a static version of:
2262///
2263/// ```rust
2264/// # use data_encoding::{Specification, BASE32HEX};
2265/// let mut spec = Specification::new();
2266/// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2267/// spec.padding = Some('=');
2268/// assert_eq!(BASE32HEX, spec.encoding().unwrap());
2269/// ```
2270///
2271/// It conforms to [RFC4648].
2272///
2273/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-7
2274pub const BASE32HEX: Encoding = Encoding::internal_new(BASE32HEX_IMPL);
2275const BASE32HEX_IMPL: &[u8] = &[
2276    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2277    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2278    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2279    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2280    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2281    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2282    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2283    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2284    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2285    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2286    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2287    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2288    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2289    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 130, 128, 128, 128, 10, 11,
2290    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2291    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2292    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2293    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2294    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2295    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2296    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 29,
2300];
2301
2302/// Unpadded base32hex encoding
2303///
2304/// This encoding is a static version of:
2305///
2306/// ```rust
2307/// # use data_encoding::{Specification, BASE32HEX_NOPAD};
2308/// let mut spec = Specification::new();
2309/// spec.symbols.push_str("0123456789ABCDEFGHIJKLMNOPQRSTUV");
2310/// assert_eq!(BASE32HEX_NOPAD, spec.encoding().unwrap());
2311/// ```
2312pub const BASE32HEX_NOPAD: Encoding = Encoding::internal_new(BASE32HEX_NOPAD_IMPL);
2313const BASE32HEX_NOPAD_IMPL: &[u8] = &[
2314    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2315    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2316    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2317    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2318    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2319    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2320    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55,
2321    56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
2322    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
2323    79, 80, 81, 82, 83, 84, 85, 86, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70,
2324    71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 128, 128, 128, 128, 128, 128,
2325    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2326    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2327    128, 128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2328    12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128,
2329    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2330    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2331    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2332    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2333    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2334    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2335    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2336    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2337    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 29,
2338];
2339
2340/// DNSSEC base32 encoding
2341///
2342/// This encoding is a static version of:
2343///
2344/// ```rust
2345/// # use data_encoding::{Specification, BASE32_DNSSEC};
2346/// let mut spec = Specification::new();
2347/// spec.symbols.push_str("0123456789abcdefghijklmnopqrstuv");
2348/// spec.translate.from.push_str("ABCDEFGHIJKLMNOPQRSTUV");
2349/// spec.translate.to.push_str("abcdefghijklmnopqrstuv");
2350/// assert_eq!(BASE32_DNSSEC, spec.encoding().unwrap());
2351/// ```
2352///
2353/// It conforms to [RFC5155]:
2354///
2355/// - It uses a base32 extended hex alphabet.
2356/// - It is case-insensitive when decoding and uses lowercase when encoding.
2357/// - It does not use padding.
2358///
2359/// [RFC5155]: https://tools.ietf.org/html/rfc5155
2360pub const BASE32_DNSSEC: Encoding = Encoding::internal_new(BASE32_DNSSEC_IMPL);
2361const BASE32_DNSSEC_IMPL: &[u8] = &[
2362    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
2363    108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2364    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2365    116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104,
2366    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53,
2367    54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
2368    113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101,
2369    102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49,
2370    50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
2371    110, 111, 112, 113, 114, 115, 116, 117, 118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98,
2372    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2373    118, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
2374    107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 128, 128, 128, 128, 128, 128, 128,
2375    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2376    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2377    128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 13,
2378    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 128, 128, 128, 128,
2379    128, 128, 128, 128, 128, 128, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2380    26, 27, 28, 29, 30, 31, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2381    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 29,
2388];
2389
2390#[allow(clippy::doc_markdown)]
2391/// DNSCurve base32 encoding
2392///
2393/// This encoding is a static version of:
2394///
2395/// ```rust
2396/// # use data_encoding::{BitOrder, Specification, BASE32_DNSCURVE};
2397/// let mut spec = Specification::new();
2398/// spec.symbols.push_str("0123456789bcdfghjklmnpqrstuvwxyz");
2399/// spec.bit_order = BitOrder::LeastSignificantFirst;
2400/// spec.translate.from.push_str("BCDFGHJKLMNPQRSTUVWXYZ");
2401/// spec.translate.to.push_str("bcdfghjklmnpqrstuvwxyz");
2402/// assert_eq!(BASE32_DNSCURVE, spec.encoding().unwrap());
2403/// ```
2404///
2405/// It conforms to [DNSCurve].
2406///
2407/// [DNSCurve]: https://dnscurve.org/in-implement.html
2408pub const BASE32_DNSCURVE: Encoding = Encoding::internal_new(BASE32_DNSCURVE_IMPL);
2409const BASE32_DNSCURVE_IMPL: &[u8] = &[
2410    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110,
2411    112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
2412    98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119,
2413    120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107,
2414    108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53,
2415    54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116,
2416    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103,
2417    104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49,
2418    50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113,
2419    114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99,
2420    100, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
2421    122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 98, 99, 100, 102, 103, 104, 106, 107, 108, 109,
2422    110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 128, 128, 128, 128, 128, 128, 128,
2423    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2424    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2425    128, 128, 128, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 128, 128, 128, 128, 128, 128, 128, 128, 10, 11,
2426    12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
2427    128, 128, 128, 128, 128, 128, 128, 10, 11, 12, 128, 13, 14, 15, 128, 16, 17, 18, 19, 20, 128,
2428    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2431    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2432    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2433    128, 128, 128, 128, 128, 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, 21,
2436];
2437
2438/// Padded base64 encoding
2439///
2440/// This encoding is a static version of:
2441///
2442/// ```rust
2443/// # use data_encoding::{Specification, BASE64};
2444/// let mut spec = Specification::new();
2445/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2446/// spec.padding = Some('=');
2447/// assert_eq!(BASE64, spec.encoding().unwrap());
2448/// ```
2449///
2450/// It conforms to [RFC4648].
2451///
2452/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-4
2453pub const BASE64: Encoding = Encoding::internal_new(BASE64_IMPL);
2454const BASE64_IMPL: &[u8] = &[
2455    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2456    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2457    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2458    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2459    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2460    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2461    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2462    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2463    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2464    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2465    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2466    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2467    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2468    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2469    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2470    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,
2471    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2472    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2473    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2474    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2475    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2479    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2480];
2481
2482/// Unpadded base64 encoding
2483///
2484/// This encoding is a static version of:
2485///
2486/// ```rust
2487/// # use data_encoding::{Specification, BASE64_NOPAD};
2488/// let mut spec = Specification::new();
2489/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2490/// assert_eq!(BASE64_NOPAD, spec.encoding().unwrap());
2491/// ```
2492pub const BASE64_NOPAD: Encoding = Encoding::internal_new(BASE64_NOPAD_IMPL);
2493const BASE64_NOPAD_IMPL: &[u8] = &[
2494    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2495    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2496    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2497    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2498    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2499    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2500    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2501    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2502    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2503    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2504    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2505    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2506    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2507    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2508    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2509    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,
2510    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2511    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2512    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2513    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2514    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2515    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2516    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2517    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2518    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2519];
2520
2521/// MIME base64 encoding
2522///
2523/// This encoding is a static version of:
2524///
2525/// ```rust
2526/// # use data_encoding::{Specification, BASE64_MIME};
2527/// let mut spec = Specification::new();
2528/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2529/// spec.padding = Some('=');
2530/// spec.wrap.width = 76;
2531/// spec.wrap.separator.push_str("\r\n");
2532/// assert_eq!(BASE64_MIME, spec.encoding().unwrap());
2533/// ```
2534///
2535/// It does not exactly conform to [RFC2045] because it does not print the header
2536/// and does not ignore all characters.
2537///
2538/// [RFC2045]: https://tools.ietf.org/html/rfc2045
2539pub const BASE64_MIME: Encoding = Encoding::internal_new(BASE64_MIME_IMPL);
2540const BASE64_MIME_IMPL: &[u8] = &[
2541    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2542    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2543    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2544    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2545    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2546    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2547    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2548    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2549    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2550    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2551    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2552    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2553    128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2554    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2555    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2556    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,
2557    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2558    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2562    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2563    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2564    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2565    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30, 76, 13, 10,
2566];
2567
2568/// MIME base64 encoding without trailing bits check
2569///
2570/// This encoding is a static version of:
2571///
2572/// ```rust
2573/// # use data_encoding::{Specification, BASE64_MIME_PERMISSIVE};
2574/// let mut spec = Specification::new();
2575/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
2576/// spec.padding = Some('=');
2577/// spec.wrap.width = 76;
2578/// spec.wrap.separator.push_str("\r\n");
2579/// spec.check_trailing_bits = false;
2580/// assert_eq!(BASE64_MIME_PERMISSIVE, spec.encoding().unwrap());
2581/// ```
2582///
2583/// It does not exactly conform to [RFC2045] because it does not print the header
2584/// and does not ignore all characters.
2585///
2586/// [RFC2045]: https://tools.ietf.org/html/rfc2045
2587pub const BASE64_MIME_PERMISSIVE: Encoding = Encoding::internal_new(BASE64_MIME_PERMISSIVE_IMPL);
2588const BASE64_MIME_PERMISSIVE_IMPL: &[u8] = &[
2589    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2590    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2591    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66,
2592    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2593    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2594    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67,
2595    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2596    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2597    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 65, 66, 67, 68,
2598    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2599    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2600    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 128, 128, 128, 128,
2601    128, 128, 128, 128, 128, 128, 129, 128, 128, 129, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2602    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2603    128, 62, 128, 128, 128, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2604    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,
2605    24, 25, 128, 128, 128, 128, 128, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2606    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2609    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2610    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2611    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 61, 14, 76, 13, 10,
2614];
2615
2616/// Padded base64url encoding
2617///
2618/// This encoding is a static version of:
2619///
2620/// ```rust
2621/// # use data_encoding::{Specification, BASE64URL};
2622/// let mut spec = Specification::new();
2623/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2624/// spec.padding = Some('=');
2625/// assert_eq!(BASE64URL, spec.encoding().unwrap());
2626/// ```
2627///
2628/// It conforms to [RFC4648].
2629///
2630/// [RFC4648]: https://tools.ietf.org/html/rfc4648#section-5
2631pub const BASE64URL: Encoding = Encoding::internal_new(BASE64URL_IMPL);
2632const BASE64URL_IMPL: &[u8] = &[
2633    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2634    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2635    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2636    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2637    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2638    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2639    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2640    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2641    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2642    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2643    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2644    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2645    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2646    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2647    128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 130, 128,
2648    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,
2649    24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2650    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2651    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2652    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2653    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2654    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 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, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2657    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 61, 30,
2658];
2659
2660/// Unpadded base64url encoding
2661///
2662/// This encoding is a static version of:
2663///
2664/// ```rust
2665/// # use data_encoding::{Specification, BASE64URL_NOPAD};
2666/// let mut spec = Specification::new();
2667/// spec.symbols.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
2668/// assert_eq!(BASE64URL_NOPAD, spec.encoding().unwrap());
2669/// ```
2670pub const BASE64URL_NOPAD: Encoding = Encoding::internal_new(BASE64URL_NOPAD_IMPL);
2671const BASE64URL_NOPAD_IMPL: &[u8] = &[
2672    65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
2673    89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
2674    115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66,
2675    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
2676    97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,
2677    116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67,
2678    68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97,
2679    98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
2680    117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 65, 66, 67, 68,
2681    69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98,
2682    99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
2683    118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 45, 95, 128, 128, 128, 128,
2684    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2685    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2686    128, 128, 128, 62, 128, 128, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 128, 128, 128, 128, 128,
2687    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,
2688    24, 25, 128, 128, 128, 128, 63, 128, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
2689    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2690    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2691    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2692    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2693    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2694    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2695    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
2696    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 30,
2697];