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
и расширения возможных цифр, есть ли другое место, в которое я должен обратить внимание, во-первых, где это уже реализовано?
Ответы
Ответ 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);