Class Base58

java.lang.Object
org.apache.commons.codec.binary.BaseNCodec
org.apache.commons.codec.binary.Base58
All Implemented Interfaces:
BinaryDecoder, BinaryEncoder, Decoder, Encoder

public class Base58 extends BaseNCodec
Provides Base58 encoding and decoding as commonly used in cryptocurrency and blockchain applications.

Base58 is a binary-to-text encoding scheme that uses a 58-character alphabet to encode data. It avoids characters that can be confused (0/O, I/l, +/) and is commonly used in Bitcoin and other blockchain systems.

This implementation accumulates data internally until EOF is signaled, at which point the entire input is converted using BigInteger arithmetic. This is necessary because Base58 encoding/decoding requires access to the complete data to properly handle leading zeros.

This class is thread-safe for read operations but the Context object used during encoding/decoding should not be shared between threads.

The Base58 alphabet is:

 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
 

This excludes: 0, I, O, and l.

Since:
1.22.0
See Also:
  • Field Details

    • BASE

      private static final BigInteger BASE
    • EMPTY

      private static final byte[] EMPTY
    • ENCODE_TABLE

      private static final byte[] ENCODE_TABLE
      Base58 alphabet: 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz (excludes: 0, I, O, l).
    • DECODE_TABLE

      private static final byte[] DECODE_TABLE
      This array is a lookup table that translates Unicode characters drawn from the "Base58 Alphabet" into their numeric equivalents (0-57). Characters that are not in the Base58 alphabet are marked with -1.
  • Constructor Details

    • Base58

      public Base58()
      Constructs a Base58 codec used for encoding and decoding.
    • Base58

      public Base58(Base58.Builder builder)
      Constructs a Base58 codec used for encoding and decoding with custom configuration.
      Parameters:
      builder - the builder with custom configuration.
  • Method Details

    • builder

      public static Base58.Builder builder()
      Creates a new Builder.

      To configure a new instance, use a Base58.Builder. For example:

       Base58 base58 = Base58.builder()
         .setEncode(true)
         .get()
       
      Returns:
      a new Builder.
    • convertFromBase58

      private void convertFromBase58(byte[] base58, BaseNCodec.Context context)
      Converts Base58 encoded data to binary.

      Uses BigInteger arithmetic to convert the Base58 string to binary data. Leading '1' characters in the Base58 encoding represent leading zero bytes in the binary data.

      Parameters:
      base58 - the Base58 encoded data.
      context - the context for this decoding operation.
      Throws:
      IllegalArgumentException - if the Base58 data contains invalid characters.
    • convertToBase58

      private byte[] convertToBase58(byte[] accumulate, BaseNCodec.Context context)
      Converts accumulated binary data to Base58 encoding.

      Uses BigInteger arithmetic to convert the binary data to Base58. Leading zeros in the binary data are represented as '1' characters in the Base58 encoding.

      Parameters:
      accumulate - the binary data to encode.
      context - the context for this encoding operation.
      Returns:
      the buffer containing the encoded data.
    • decode

      void decode(byte[] array, int offset, int length, BaseNCodec.Context context)
      Decodes the given Base58 encoded data.

      This implementation accumulates data internally. When length is less than 0 (EOF), the accumulated data is converted from Base58 to binary.

      Specified by:
      decode in class BaseNCodec
      Parameters:
      array - the byte array containing Base58 encoded data.
      offset - the offset in the array to start from.
      length - the number of bytes to decode, or negative to signal EOF.
      context - the context for this decoding operation.
    • encode

      void encode(byte[] array, int offset, int length, BaseNCodec.Context context)
      Encodes the given binary data as Base58.

      This implementation accumulates data internally. When length is less than 0 (EOF), the accumulated data is converted to Base58.

      Specified by:
      encode in class BaseNCodec
      Parameters:
      array - the byte array containing binary data to encode.
      offset - the offset in the array to start from.
      length - the number of bytes to encode, or negative to signal EOF.
      context - the context for this encoding operation.
    • getStringBuilder

      private StringBuilder getStringBuilder(byte[] accumulate)
      Builds the Base58 string representation of the given binary data.

      Converts binary data to a BigInteger and divides by 58 repeatedly to get the Base58 digits. Handles leading zeros by counting them and appending '1' for each leading zero byte.

      Parameters:
      accumulate - the binary data to convert.
      Returns:
      a StringBuilder with the Base58 representation (not yet reversed).
    • isInAlphabet

      protected boolean isInAlphabet(byte value)
      Returns whether or not the octet is in the Base58 alphabet.
      Specified by:
      isInAlphabet in class BaseNCodec
      Parameters:
      value - The value to test.
      Returns:
      true if the value is defined in the Base58 alphabet false otherwise.