Java numbers with radix > Character.MAX_RADIX

Lukas Eder picture Lukas Eder · Apr 27, 2011 · Viewed 11.6k times · Source

I have a five-character String and I want to use those five characters as an ASCII-encoded (printable) number. The simplest way to achieve this is to use

Long.toString(number, Character.MAX_RADIX);

This will give me numbers from "0" to "zzzzz". Unfortunately Long.toString(int, int) only supports lower-case letters, no upper-case letters. This means that the max radix is 36 and the highest number I can encode is 36^5 - 1 = 60 466 175. If I could use both lower and upper-case letters, I'd get a max radix of 62 and the highest encodable number is 62^5 - 1 = 916 132 831.

Apart from copying Long's source code and extending the possible digits, is there any other place I should look into, first, where this is already implemented?

Answer

WhiteFang34 picture WhiteFang34 · Apr 27, 2011

If you're willing to go two characters beyond alphanumeric you could use Base64 encoding.

Using Base64 from Apache Commons Codec you could get 1073741824 possible values like this:

byte bytes[] = new byte[4];
bytes[0] = (byte) ((value >> 24) & 0xFF);
bytes[1] = (byte) ((value >> 16) & 0xFF);
bytes[2] = (byte) ((value >> 8) & 0xFF);
bytes[3] = (byte) (value & 0xFF);
String encoded = Base64.encodeBase64String(bytes).substring(1, 6);