Номера Java с символом radix>.MAX RADIX

у меня есть пять символов, и я хочу использовать эти пять символов в кодировке ASCII (печатные) количество. Самый простой способ достичь этого-использовать

Long.toString(number, Character.MAX_RADIX);

это даст мне номера от "0" to "zzzzz". К сожалению Long.toString(int, int) поддерживает только строчные буквы, без заглавных букв. Это означает, что max radix является 36 и самое большое число, которое я могу кодировать, это 36^5 - 1 = 60 466 175. Если бы я мог использовать оба lower и прописные буквы, я бы получил Макс радикс 62 и самый высокий encodable номером 62^5 - 1 = 916 132 831.

помимо копирования Longисходный код и расширение возможных цифр, есть ли какое-либо другое место, в которое я должен заглянуть, во-первых, где это уже реализовано?

2 ответов


вы не указываете, должны ли символы быть printable ASCII:

  • если они это сделают, то вы можете перейти к 95^5. Существует 95 печатных символов ASCII из пространства (SP) в Тильду (~).

  • если они не делают, то вы можете пойти в 128^5 ==2^35.

в любом случае, алгоритм выполнения преобразования прост и проще, чем расширение до Long.toString(...). (Вы предположительно, не нужно беспокоиться о знаках, ошибках диапазона или отверстиях в символе <-> значное отображение. Было бы проще закодировать это с нуля.)

однако, я не знаю ни одного существующей реализация расширенных чисел radix.


Если вы готовы выйти на два символа за пределы буквенно-цифрового, вы можете использовать в base64 кодировка.

используя Base64 С Кодек Apache Commons вы можете получить 1073741824 возможные значения, как это:

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);