Конвертировать base64 в текст - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю над приложением, где я получаю сообщения, закодированные в base64.сообщения могут быть получены на всех языках и могут содержать только цифры.Мне нужно конвертировать base64 в читаемый текст.чтобы получить текст.Я использую apache.commons.codec.binary.Base64 и apache.commons.codec.binary.Hex

У меня 2 проблемы:

  1. при попытке разобрать сообщенияполученные на английском языке или числа, я не могу правильно разобрать base 64.
  2. как я могу отличить сообщение base64, которое представлено 4 цифрами шестнадцатеричного числа, такого как русский или иврит, с сообщением на английском языке или числами, которые представлены как2 цифры шестнадцатеричного числа, например цифры или английский.

вот мой код:

private String convertBase64StringToText(String base64) {
    base64 = "MdmMBg==";//base64.replace("\n", "").replace("\r", "");
    byte[] decoded = Base64.decodeBase64(base64);
    String basetohex = Hex.encodeHexString(decoded);
    char ch[] = basetohex.toCharArray();
    String output = new String(ch);
    output = output.toUpperCase();
    StringBuilder str = new StringBuilder();
    for(int i=0;i<ch.length;i=i+2){

        str.append((char) Integer.parseInt(output.substring(i, i + 2), 16));
        //for languages like russian or hebrew i'm changing from 
         //output.substring(i, i + 2) to output.substring(i, i + 4) and it 
          //works fine

    }

    System.out.println("str.toString():"+str.toString());//received: 1Ù instead of 1234
    return str.toString();
}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Кодировка base64 будет применяться к двоичной форме данных, которые вы получили.

Получив двоичную форму, вам нужно будет использовать кодировку символов, например UTF-8 (но это зависит от того, что использовалось изначально), чтобы преобразовать двоичные данные в строку Unicode.

Если у вас есть строка Unicode, она сможет поддерживать все символы в наборе Unicode.Вам не придется беспокоиться о том, русские ли они, иврит или кто-то другой.

0 голосов
/ 04 декабря 2018

Следующие четыре служебных метода помогут вам кодировать и декодировать в Base64 и из него.Пожалуйста, попробуйте их, я думаю, что ваша проблема решится, так как эти методы используют UTF-8 в качестве своей кодировки:

public static String encodeBase64(String plainText) {
    byte[] plainTextByteArray = plainText.getBytes(StandardCharsets.UTF_8);
    String base64Encoded = Base64.getEncoder().encodeToString(plainTextByteArray);
    return base64Encoded;
}

public static String decodeBase64(String base64File) {
    byte[] byteArray = Base64.getDecoder().decode(base64File);
    String decodedStr = new String(byteArray, StandardCharsets.UTF_8);
    return decodedStr;
}

public static String encodeBase64(byte[] fileByteArray) {
    String base64Encoded = Base64.getEncoder().encodeToString(fileByteArray);
    return base64Encoded;
}

public static byte[] decodeBase64ToByteArray(String base64File) {
    byte[] byteArray = Base64.getDecoder().decode(base64File);
    return byteArray;
}
...