java декодирование строки base64

Я понимаю, что это, вероятно, больше общий вопрос о Java, но, поскольку он работает в среде Notes \ Domino, я подумал, что сначала проверю это сообщество.

Сводка:

Кажется, я не могу декодировать строку: dABlAHMAdAA=, используя lotus.domino.axis.encoding.Base64 или sun.misc.BASE64Decoder.

Я знаю, что исходный текст: тест

Я подтвердил расшифровку на http://www5.rptea.com/base64/, похоже, это UTF -16.

Как простой тест, используя любой из следующих:

String s_base64 = "dABlAHMAdAA=";
byte[] byte_base64 = null;
String s_decoded = "";

byte_base64 = new sun.misc.BASE64Decoder().decodeBuffer(s_base64);
s_decoded = new String(byte_base64, "UTF-16");
System.out.println("Test1: " + s_decoded);

byte_base64 = lotus.domino.axis.encoding.Base64.decode(s_base64);
s_decoded = new String(byte_base64, "UTF-16");
System.out.println("Test2: " + s_decoded);

System.out.println("========= FINISH.");

Я получаю вывод:
Test1: ????
Test2: ????

Если я создам строку как UTF-8

s_decoded = new String(byte_base64, "UTF-8");

выдает:
t
ошибка не выдается, но код не завершается, не доходит до "ФИНИША".

Подробнее

Я обращаюсь к веб-службе asmx, в ответе SOAP некоторые узлы содержат данные в кодировке base64. На данный момент нет возможности изменить службу, поэтому мне приходится использовать XPath и декодировать самому. Закодированные данные представляют собой текст или html. Если я передам закодированные данные через http://www5.rptea.com/base64/ и выберу UTF -16, декодирует правильно, значит, я что-то делаю не так.

В качестве примечания я закодировал «тест»:

s_base64 = lotus.domino.axis.encoding.Base64.encode(s_text.getBytes());
System.out.println("test1 encodes to: " + s_base64);

s_base64 = new sun.misc.BASE64Encoder().encode(s_text.getBytes());
System.out.println("test2 encodes to: " + s_base64);

они оба кодируют в:
dGVzdA== ...который, если вы затем подадите его в 2 декодера выше, как и ожидалось, декодирует правильно.

Если я перейду на сайт выше и закодирую «тест» как UTF-16, я получу: dABlAHMAdAA=, что подтверждает, что данные находятся в UTF-16.

Это похоже на то, что данные являются подлинными данными base64, но декодер не распознает их как таковые. Я немного в тупике в данный момент.

Любые указатели или комментарии будут с благодарностью получены.


person nick wall    schedule 24.07.2013    source источник


Ответы (2)


Строка была закодирована в UTF-16LE (с прямым порядком байтов), где младший байт хранится первым. Java по умолчанию использует обратный порядок байтов. Вам нужно использовать:

s_decoded = new String(byte_base64, "UTF-16LE");
person Joni    schedule 24.07.2013
comment
Если бы я мог прыгнуть через экран и обнять тебя, я бы это сделал. Я часами возился с этим. Большое большое спасибо. - person nick wall; 24.07.2013
comment
новая строка (byte_base64, StandardCharsets.UTF_16LE) возможна после Java 7 - person naveejr; 20.08.2014

я использовал ваш пример "dABlAHMAdAA=" в моем онлайн-инструменте декодирования base64, и кажется, что вам не хватает jar-файлов Apache base64. Нажмите на ссылку ниже.

http://www.hosting4free.info/Base64Decode/Base64-Decode.jsp

Код веб-сайта

import org.apache.commons.codec.binary.Base64;

public class base64decode

{

public static void main(String[] args) throws UnsupportedEncodingException 
   {


    byte[] decoded = Base64.decodeBase64("YWJjZGVmZw==".getBytes());
    System.out.println(new String(decoded) + "\n");

}

}
person Dharmesh Patel    schedule 22.08.2013