Multibase
An Elixir implementation of the multibase specification — a self-describing base encoding protocol.
Multibase prefixes a single character to encoded data so that the base encoding used can be unambiguously identified when decoding. This library handles the prefixing, encoding, and decoding steps for a set of commonly used base encodings.
Supported Encodings
| Encoding | Prefix | Atom |
|---|---|---|
| Base16 (lowercase) | f | :base16 |
| Base16 (uppercase) | F | :base16upper |
| Base32 (lowercase, no pad) | b | :base32 |
| Base32 (uppercase, no pad) | B | :base32upper |
| Base32 (lowercase, padded) | c | :base32pad |
| Base32 (uppercase, padded) | C | :base32padupper |
| Base36 (lowercase) | k | :base36 |
| Base58 BTC | z | :base58btc |
| Base58 Flickr | Z | :base58flickr |
| Base64 (no pad) | m | :base64 |
| Base64 (padded) | M | :base64pad |
| Base64 URL-safe (no pad) | u | :base64url |
| Base64 URL-safe (padded) | U | :base64urlpad |
Usage
Encoding
Multibase.encode("hello world", :base32)
# => "bnbswy3dpeb3w64tmmq"
Multibase.encode("hello world", :base58btc)
# => "zStV1DL6CwTryKyV"Decoding
Decoding automatically detects the encoding from the prefix character:
Multibase.decode!("bnbswy3dpeb3w64tmmq")
# => "hello world"
Multibase.decode("zStV1DL6CwTryKyV")
# => {:ok, "hello world"}Using individual codecs directly
Each base encoding is also available as its own module if you want to encode or decode without the multibase prefix:
Multibase.Base58.encode("hello world")
# => "StV1DL6CwTryKyV"
Multibase.Base58.decode!("StV1DL6CwTryKyV")
# => "hello world"Custom base encodings
The Multibase.Codec behaviour defines the contract that all base encoding modules implement. If you are building a custom base encoding, implementing this behaviour ensures your module follows the same interface as the built-in ones:
defmodule MyApp.Base45 do
@behaviour Multibase.Codec
@impl true
def encode(data, _opts), do: # ...
@impl true
def decode(data, _opts), do: # ...
@impl true
def decode!(data, _opts), do: # ...
end
The Multibase.AnyBase module can also be used to generate a base encoding module from a custom alphabet at compile time. See its documentation for details.
Part of the multiformats ecosystem
This library is one component of a family of Elixir multiformats libraries. For runtime codec registration and cross-component composition, see the multicodec project.