public static byte [ ] decode ( String input ) throws IllegalArgumentException { if ( input . startsWith ( "base58:" ) ) input = input . substring ( 7 ) ; if ( input . length ( ) == 0 ) return new byte [ 0 ] ; // Convert the base58-encoded ASCII chars to a base58 byte sequence (base58 digits). byte [ ] input58 = new byte [ input . length ( ) ] ; for ( int i = 0 ; i < input . length ( ) ; ++ i ) { char c = input . charAt ( i ) ; int digit = c < 128 ? INDEXES [ c ] : - 1 ; if ( digit < 0 ) { throw new IllegalArgumentException ( "Illegal character " + c + " at position " + i ) ; } input58 [ i ] = ( byte ) digit ; } // Count leading zeros. int zeros = 0 ; while ( zeros < input58 . length && input58 [ zeros ] == 0 ) { ++ zeros ; } // Convert base-58 digits to base-256 digits. byte [ ] decoded = new byte [ input . length ( ) ] ; int outputStart = decoded . length ; for ( int inputStart = zeros ; inputStart < input58 . length ; ) { decoded [ -- outputStart ] = divmod ( input58 , inputStart , 58 , 256 ) ; if ( input58 [ inputStart ] == 0 ) { ++ inputStart ; // optimization - skip leading zeros } } // Ignore extra leading zeroes that were added during the calculation. while ( outputStart < decoded . length && decoded [ outputStart ] == 0 ) { ++ outputStart ; } // Return decoded data (including original number of leading zeros). return Arrays . copyOfRange ( decoded , outputStart - zeros , decoded . length ) ; }
Decodes the given base58 string into the original data bytes .