2017-01-13 26 views
2

В настоящее время я работаю над алгоритмом для кодирования нормальной строки с каждым возможным символом в строку Base36.Encode String to Base36

Я пробовал следующее, но он не работает.

public static String encode(String str) { 
    return new BigInteger(str, 16).toString(36); 
} 

Я думаю, это потому, что строка - это не только шестнадцатеричная строка. Если я использую строку «Hello22334!» В Base36, я получаю NumberFormatException.

Мой подход заключается в преобразовании каждого символа в число. Преобразуйте числа в шестнадцатеричное представление, а затем преобразуйте hexstring в Base36.

Является ли мой подход в порядке или есть более простой или лучший способ?

+0

Я не понимаю, как «каждый возможный характер» и использование «BigInteger» с базой 16 должно сочетаться. Вероятно, вы захотите сначала преобразовать строку в байты и преобразовать ее. Просто имейте в виду, что представление байта строки зависит от используемой кодировки и что, если вы не предоставите кодировку, будет использоваться системный по умолчанию (и это может измениться при работе в другой системе). – Thomas

+0

Я просто попробовал, и он не работает. Проблема в том, что я не знаю возможного решения. –

+2

Вы могли бы взглянуть на то, как «java.util.Base64» реализован и адаптируется к базе 36. – Thomas

ответ

8

Сначала вам нужно преобразовать строку в число, представленное набором байтов. Для чего используется кодировка. Я настоятельно рекомендую UTF-8.

Тогда вам необходимо преобразовать это число, набор байтов в строке, в базе 36.

byte[] bytes = string.getBytes(StandardCharsets.UTF_8); 
String base36 = new BigInteger(1, bytes).toString(36); 

Для декодирования:

byte[] bytes = new Biginteger(base36, 36).toByteArray(); 
String string = new String(bytes, StandardCharsets.UTF_8); 
+0

Спасибо. Это отлично работает! Вы сохраняете мой день :-) –

+0

Пока это берет с использованием 'BigInteger', я считаю, что это странный подход. – greybeard

+1

Нет проблем. :) Я немного изменил ответ. Вы можете передать '1' в качестве первого параметра конструктору BigInteger, чтобы всегда было положительным числом. Пожалуйста, отметьте ответ, если он ответил на ваш вопрос. :) –