Greetings!

Converting base 10 number to another base is a common mathematical operation. First of all, why do we need base62?

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Noted how the 4 characters has represented only with 2 characters.

Note that I have added base58 as well. That is because 0OIl characters are hard to read. As 0(zero), I(capital i), O(capital o) and l(lower case L) characters look the same depending on the font, I prefer to use base58.

Happy coding :)

Converting base 10 number to another base is a common mathematical operation. First of all, why do we need base62?

- Shorten a given URL
- Saving a file using timestamp
- Short text

### Let's do the Math

Converting to another base has common steps. (base-10-to-other-bases)- Divide the number by the base and get the remainder.
- Divide the quotient and get the remainder.
- Continue this process untill the quotient is zero.
- Order the remainders from last to first.

```
42
42 / 16 = remainder 10, quotient 2
2 / 16 = remainder 2, quotient 0
Since 10 is A in hexa representation
42 = 2A in hexa-decimal number system.
```

This same logic is applied for Base62. We can use 0-9A-Za-z characters to encoe base62.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

130 130 / 62 = remainder 6, quotient 2 2/ 62 = remainder 2, quotient 0 130 = 26

1000 1000/ 62 = remainder 8, quotient 16 16/ 62 = remainder 16, quotient 0 1000 = G8

Noted how the 4 characters has represented only with 2 characters.

### Let's code

As the code is faily simple, I just add it here.Note that I have added base58 as well. That is because 0OIl characters are hard to read. As 0(zero), I(capital i), O(capital o) and l(lower case L) characters look the same depending on the font, I prefer to use base58.

```
package com.slmanju.baseconverter;
public class Base10Encoder implements BaseEncoder {
private final int base;
private final String characters;
public final static BaseEncoder BASE_2 = new Base10Encoder(2, "01");
public final static BaseEncoder BASE_16 = new Base10Encoder(16, "0123456789ABCDEF");
public final static BaseEncoder BASE_62 = new Base10Encoder(62, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
public final static BaseEncoder BASE_58 = new Base10Encoder(58, "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");
public Base10Encoder(int base, String characters) {
this.base = base;
this.characters = characters;
}
@Override
public String encode(long number) {
StringBuilder stringBuilder = new StringBuilder(1);
do {
stringBuilder.insert(0, characters.charAt((int) (number % base)));
number /= base;
} while (number > 0);
return stringBuilder.toString();
}
@Override
public long decode(String number) {
long result = 0L;
int length = number.length();
for (int i = 0; i < length; i++) {
result += (long) Math.pow(base, i) * characters.indexOf(number.charAt(length - i - 1));
}
return result;
}
}
```

```
package com.slmanju.baseconverter;
public interface BaseEncoder {
String encode(long number);
long decode(String number);
}
```