5

Декодирование данных Base64 в Java

16

У меня есть изображение, закодированное в формате Base64. Какой самый лучший способ декодировать его на Java? Надеюсь, при этом использовать только библиотеки, включенные в Sun Java 6.

5 ответ(ов)

0

Ваше решение по кодированию и декодированию Base64 действительно выглядит довольно быстрым и простым. Вот подробное объяснение кода, с комментариями о его реализации:

Кодировка Base64

Метод encode принимает массив байтов и возвращает его строковое представление в формате Base64.

  1. Объявляем константы: Мы объявляем алфавит Base64 как массив символов. Также создаем массив toInt, где будем хранить соответствие символов алфавита и их индексов.

  2. Инициализация toInt: В статическом блоке инициализируем массив toInt, заполняя его индексами символов из алфавита. Это позволит быстро получать индекс символа по его значению при декодировании.

  3. Основной цикл кодирования: Метод проходит через входной массив по три байта за раз и преобразует их в четыре символа.

    • Мы используем битовые операции, чтобы извлекать нужные биты из байтов, а затем подставляем их в ar.
  4. Добавление символов заполнения: В конце, в зависимости от длины входного массива, добавляем 1 или 2 символа = для завершения данных.

  5. Возврат результата: Возвращаем строку, созданную из массива символов.

Декодирование Base64

Метод decode принимает строку, закодированную в Base64, и возвращает соответствующий массив байтов.

  1. Обработка символов заполнения: Сначала определяем, сколько символов = в конце строки, чтобы знать, сколько байтов следует извлечь.

  2. Основной цикл декодирования: Проходим по строке по четыре символа за раз, извлекая из них соответствующие значения из toInt, и используя битовые операции для объединения их обратно в байты.

  3. Проверка длины буфера: Если длина выходного массива достигнута, возвращаем массив.

  4. Возврат результата: Возвращаем декодированный массив байтов.

Заключение

Этот подход к реализации кодирования и декодирования Base64 оптимален с точки зрения скорости и простоты. Использование битовых операций позволяет избежать дополнительных зависимостей и делает код быстро выполняемым. Однако стоит помнить, что этот код не обрабатывает ошибочные входные данные, так что для использования в продакшен-приложениях стоит добавить дополнительные проверки и обработку исключений.

0

Вот моя реализация кодирования и декодирования в формате Base64, которая может быть полезна кому-то:

public class Base64Coder {

    // Строка-разделитель для операционной системы.
    private static final String systemLineSeparator = System.getProperty("line.separator");

    // Таблица отображения из 6-битных нибблов в символы Base64.
    private static final char[] map1 = new char[64];
       static {
          int i=0;
          for (char c='A'; c<='Z'; c++) map1[i++] = c;
          for (char c='a'; c<='z'; c++) map1[i++] = c;
          for (char c='0'; c<='9'; c++) map1[i++] = c;
          map1[i++] = '+'; map1[i++] = '/'; }

    // Таблица отображения из символов Base64 в 6-битные нибблы.
    private static final byte[] map2 = new byte[128];
       static {
          for (int i=0; i<map2.length; i++) map2[i] = -1;
          for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }

    /**
    * Кодирует строку в формате Base64.
    * Пробелы и переносы строк не добавляются.
    * @param s  Строка для кодирования.
    * @return   Строка, содержащая кодированные данные в формате Base64.
    */
    public static String encodeString (String s) {
       return new String(encode(s.getBytes())); }

    /**
    * Кодирует массив байтов в формате Base64 и разбивает вывод на строки длиной 76 символов.
    * Этот метод совместим с <code>sun.misc.BASE64Encoder.encodeBuffer(byte[])</code>.
    * @param in  Массив, содержащий данные для кодирования.
    * @return    Строка, содержащая кодированные данные в формате Base64, разбитую на строки.
    */
    public static String encodeLines (byte[] in) {
       return encodeLines(in, 0, in.length, 76, systemLineSeparator); }

    /**
    * Кодирует массив байтов в формате Base64 и разбивает вывод на строки.
    * @param in            Массив, содержащий данные для кодирования.
    * @param iOff          Смещение первого байта для обработки.
    * @param iLen          Количество байтов для обработки, начиная с <code>iOff</code>.
    * @param lineLen       Длина строки для выходных данных. Должна быть кратна 4.
    * @param lineSeparator Разделитель для отделения выходных строк.
    * @return              Строка, содержащая кодированные данные в формате Base64, разбитую на строки.
    */
    public static String encodeLines (byte[] in, int iOff, int iLen, int lineLen, String lineSeparator) {
       // Реализация метода ...
    }

    // Остальные методы для кодирования и декодирования остались прежними...

    // Пустой конструктор.
    private Base64Coder() {}
}

Эта реализация предоставляет методы для кодирования строк и байтовых массивов в формат Base64, а также для их декодирования. Вы можете использовать её для работы с данными, требующими кодирования в Base64, и настроить длину строк при выводе, если это необходимо.

0

Если вы предпочитаете решение, основанное на производительности, вы можете использовать библиотеку "MiGBase64".

Вот ссылка на проект: MiGBase64

Пример кода для использования MiGBase64:

public class Base64Test {
    public static void main(String[] args) {
        String encodeToString = Base64.encodeToString("JavaTips.net".getBytes(), true);
        System.out.println("encodeToString: " + encodeToString);
        byte[] decodedBytes = Base64.decode(encodeToString.getBytes());
        System.out.println("decodedBytes: " + new String(decodedBytes));
    }
}

Этот код показывает, как закодировать строку в Base64 и затем декодировать её обратно. Библиотека MiGBase64 предоставляет эффективные методы для работы с кодировкой и декодировкой данных, что может быть полезно в критически важных для производительности приложениях.

0

Похоже, вы хотите код для кодирования и декодирования строк в формате Base64 с использованием Java 8. Вот пример кода, который вы можете использовать:

public static String encodeString(String plainString) {
    return Base64.getEncoder().encodeToString(plainString.getBytes());
}

public static String decodeString(String encodedString) {
    byte[] bytes = Base64.getDecoder().decode(encodedString);
    return new String(bytes);
}

Объяснение:

  1. Метод encodeString(String plainString):

    • Этот метод принимает строку в качестве входного параметра (plainString).
    • Он преобразует строку в массив байтов с помощью getBytes().
    • Затем использует Base64.getEncoder().encodeToString(...), чтобы закодировать массив байтов в строку формата Base64.
  2. Метод decodeString(String encodedString):

    • Этот метод принимает закодированную строку (encodedString) в качестве входного параметра.
    • Он декодирует строку с помощью Base64.getDecoder().decode(...), что возвращает массив байтов.
    • Наконец, он создает новую строку из массива байтов с помощью конструктора String(byte[]).

Примечание:

Убедитесь, что используете корректную кодировку для получения байтов. По умолчанию метод getBytes() использует кодировку по умолчанию, которая может зависеть от системы. Если необходимо, укажите явную кодировку, например, plainString.getBytes(StandardCharsets.UTF_8).

Надеюсь, это поможет!

0

Вы можете просто попробовать следующий код.

byte[] data = Base64.getDecoder().decode(base64fileContent);

Метод Base64.getDecoder() возвращает декодер Base64, который можно использовать для декодирования. Затем вам нужно декодировать ваши данные с помощью метода .decode(<ваши base64>).

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь