alphabet::BIN_HEX.DecodeSliceError::OutputSliceTooSmall is now conservative rather than precise. That is, the error will only occur if the decoded output cannot fit, meaning that Engine::decode_slice can now be used with exactly-sized output slices. As part of this, Engine::internal_decode now returns DecodeSliceError instead of DecodeError, but that is not expected to affect any external callers.DecodeError::InvalidLength now refers specifically to the number of valid symbols being invalid (i.e. len % 4 == 1), rather than just the number of input bytes. This avoids confusing scenarios when based on interpretation you could make a case for either InvalidLength or InvalidByte being appropriate.Alphabet::as_str()Debug and Clone impls for the general purpose Engineencoded_len const, allowing the creation of arrays sized to encode compile-time-known data lengthssource instead of cause on Error typesDecoderReader no longer sometimes erroneously ignores padding #226Engine.internal_decode return type changed| < 0.20 function | 0.21 equivalent |
|---|---|
encode() | engine::general_purpose::STANDARD.encode() or prelude::BASE64_STANDARD.encode() |
encode_config() | engine.encode() |
encode_config_buf() | engine.encode_string() |
encode_config_slice() | engine.encode_slice() |
decode() | engine::general_purpose::STANDARD.decode() or prelude::BASE64_STANDARD.decode() |
decode_config() | engine.decode() |
decode_config_buf() | engine.decode_vec() |
decode_config_slice() | engine.decode_slice() |
The short-lived 0.20 functions were the 0.13 functions with config replaced with engine.
If applicable, use the preset engines engine::STANDARD, engine::STANDARD_NO_PAD, engine::URL_SAFE, or engine::URL_SAFE_NO_PAD. The NO_PAD ones require that padding is absent when decoding, and the others require that canonical padding is present .
If you need the < 0.20 behavior that did not care about padding, or want to recreate < 0.20.0's predefined Configs precisely, see the following table.
| 0.13.1 Config | 0.20.0+ alphabet | encode_padding | decode_padding_mode |
|---|---|---|---|
| STANDARD | STANDARD | true | Indifferent |
| STANDARD_NO_PAD | STANDARD | false | Indifferent |
| URL_SAFE | URL_SAFE | true | Indifferent |
| URL_SAFE_NO_PAD | URL_SAFE | false | Indifferent |
Engine.decode_slice_unchecked.Engine as a pub use in prelude.engine are removed in favor of base64::prelude::... that are better suited to those who wish to use the entire path to a name.FastPortable was only meant to be an interim name, and shouldn't have shipped in 0.20. It is now GeneralPurpose to make its intended usage more clear.GeneralPurpose and its config are now pub use'd in the engine module for convenience.from() functions to be new(). from() causes confusing compiler errors because of confusion with From::from, and is a little misleading because some of those invocations are not very cheap as one would usually expect from a from call.encode* and decode* top level functions are now methods on Engine.DEFAULT_ENGINE was replaced by engine::general_purpose::STANDARDengine::general_purpose::{STANDARD, STANDARD_NO_PAD, URL_SAFE, URL_SAFE_NO_PAD}pub used into engine as well*_slice decode/encode functions now return an error instead of panicking when the output slice is too smalldecoded_len_estimate() is provided to make it easy to size decode buffers correctly.NO_PAD config now requires that padding be absent when decoding.Config concept into the Engine abstraction, allowing the user to pick different encoding / decoding implementations.FastPortable engine, so named because it's portable (works on any CPU) and relatively fast.ConstantTimePortable?) for security-sensitive applications that need side-channel resistance, and CPU-specific SIMD implementations for more speed.DEFAULT_ENGINE. To use different alphabets or other settings ( padding, etc), create your own engine instance.CharacterSet is now Alphabet (per the RFC), and allows creating custom alphabets. The corresponding tables that were previously code-generated are now built dynamically.const fn.DecoderReader now owns its inner reader, and can expose it via into_inner(). For symmetry, EncoderWriter can do the same with its writer.encoded_len is now public so you can size encode buffers precisely.decode_config.EncoderStringWriter to allow encoding directly to a StringEncoderWriter now owns its delegate writer rather than keeping a reference to it (though refs still work)EncoderWriter via finish(), which returns Result<W> instead of Result<()>. If you were calling finish() explicitly, you will now need to use let _ = foo.finish() instead of just foo.finish() to avoid a warning about the unused value.InvalidByte will be emitted instead of InvalidLength to make the problem more obvious.BinHex alphabetBcrypt alphabetRead implementation (DecoderReader) to let users transparently decoded data from a b64 input sourceAsRef<[ut8]> for main encode*/decode* functionsno_std is now supported via the two new features alloc and std.EncoderWriter::write.Base64Display creation no longer uses a Result because it can't fail, which means its helper methods for common configs that unwrap() for you are no longer neededWrite impl to transparently base64 as you write.unsafe code.no_std support. No out of the box configs use it, and it's trivial to do yourself if needed: filter(|b| !b" \n\t\r\x0b\x0c".contains(b).Clone for DecodeError.crypt(3)'s base64 variant.decode_config_slice function for no-allocation decoding, analogous to encode_config_sliceencode_config_slice function for no-allocation encodingSTANDARD_NO_PAD configBase64Display heap-free wrapper for use in format strings, etcunsafe in fewer placesdecode_wsBase64Error to DecodeErrorAsRef<[u8]> instead of just a &str