Кодировать строку в 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;
    }
Другие вопросы по тегам