Преобразовать байтовый массив в понятную строку - PullRequest
3 голосов
/ 16 апреля 2010

У меня есть программа, которая обрабатывает байтовые массивы в Java, и теперь я хотел бы записать это в файл XML. Однако я не уверен, как преобразовать следующий байтовый массив в разумную строку для записи в файл. Предполагая, что это были символы Unicode, я попытался следующий код:

String temp = new String(encodedBytes, "UTF-8");

Только для того, чтобы отладчик показал, что encodedBytes содержит "\ufffd\ufffd ^\ufffd\ufffd-m\ufffd\ufffd\/ufffd \ufffd\ufffdIA\ufffd\ufffd". Строка должна содержать хэш в буквенно-цифровом формате.

Как бы превратить вышеуказанную строку в разумную строку для вывода?

Ответы [ 2 ]

10 голосов
/ 16 апреля 2010

Массив байтов не похож на UTF-8. Обратите внимание, что \ufffd (с именем REPLACEMENT CHARACTER) - это ", используемый для замены входящего символа, значение которого неизвестно или не может быть представлено в Unicode."

Приложение: Вот простой пример того, как это может произойти. При приведении к byte кодовая точка для ñ не является ни UTF-8, ни US-ASCII; но является действующим ISO-8859-1. По сути, вы должны знать, что представляют байты, прежде чем сможете их кодировать в String.

public class Hello {

    public static void main(String[] args)
            throws java.io.UnsupportedEncodingException {
        String s = "Hola, señor!";
        System.out.println(s);
        byte[] b = new byte[s.length()];
        for (int i = 0; i < b.length; i++) {
            int cp = s.codePointAt(i);
            b[i] = (byte) cp;
            System.out.print((byte) cp + " ");
        }
        System.out.println();
        System.out.println(new String(b, "UTF-8"));
        System.out.println(new String(b, "US-ASCII"));
        System.out.println(new String(b, "ISO-8859-1"));
    }
}

Выход:

Hola, señor!
72 111 108 97 44 32 115 101 -15 111 114 33 
Hola, se�or!
Hola, se�or!
Hola, señor!
7 голосов
/ 16 апреля 2010

Если ваша строка является результатом схемы хеширования пароля (которая выглядит так, как это может быть), то я думаю, что вам потребуется кодирование Base64, чтобы поместить ее в простой текст.

Стандартная процедура, если у вас есть необработанные байты, которые вы хотите вывести в текстовый файл, это использовать кодировку Base 64. Библиотека Commons Codec предоставляет для использования кодировщик / декодер Base64.

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

...