Кодировать строку в Base36
В настоящее время я работаю над алгоритмом для кодирования нормальной строки с каждым возможным символом в строку Base36.
Я пробовал следующее, но это не работает.
public static String encode(String str) {
return new BigInteger(str, 16).toString(36);
}
Я думаю, это потому, что строка не просто шестнадцатеричная строка. Если я использую строку "Hello22334!" В Base36, то я получаю NumberFormatException
,
Мой подход заключается в преобразовании каждого символа в число. Преобразуйте числа в шестнадцатеричное представление, а затем преобразуйте шестнадцатеричную строку в Base36.
Мой подход в порядке или есть более простой или лучший способ?
2 ответа
Сначала вам нужно преобразовать вашу строку в число, представленное набором байтов. Для чего вы используете кодировку. Я очень рекомендую 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);
С Base10 на Base36
public static String toBase36(String str) {
try {
return Long.toString(Long.valueOf(str), 36).toUpperCase();
} catch (NumberFormatException | NullPointerException ex) {
ex.printStackTrace();
}
return null;
}
От Base36String к Base10
public static String fromBase36(String b36) {
try {
BigInteger base = new BigInteger( b36, 36);
return base.toString(10);
}catch (Exception e){
e.printStackTrace();
}
return null;
}