Java числа с основанием> Character.MAX_RADIX - PullRequest
12 голосов
/ 27 апреля 2011

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

Ответы [ 2 ]

4 голосов
/ 27 апреля 2011

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

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

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

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

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

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

...