Подтвердить что ты не робот

Java-номера с основанием> Character.MAX_RADIX

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

Long.toString(number, Character.MAX_RADIX);

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

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

4b9b3361

Ответ 1

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

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

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

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

Тем не менее, я не знаю о какой-либо существующей реализации расширенных номеров radix.

Ответ 2

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

Используя Base64 из Apache Commons Codec вы может получить 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);