Преобразование двоичных данных в строку - PullRequest
1 голос
/ 04 февраля 2012

Если у меня есть некоторые двоичные данные D, и я преобразовываю их в строку S. Я ожидаю, что при преобразовании их обратно в двоичный файл я получу D. Но это неправильно.

public class A {
    public static void main(String[] args) throws IOException {
        final byte[] bytes = new byte[]{-114, 104, -35};// In hex: 8E 68 DD
        System.out.println(bytes.length);               //prints 3
        System.out.println(new String(bytes, "UTF-8").getBytes("UTF-8").length); //prints 7
    }
}

Почему это происходит?

Ответы [ 3 ]

2 голосов
/ 05 февраля 2012

Преобразование между байтовым массивом в строку и обратно не является операцией отображения один-к-одному. Считывая docs , реализация String использует CharsetDecoder для преобразования входного байтового массива в юникод. Первый и последний байты во входном байтовом массиве не должны отображаться на допустимый символ Юникода, поэтому он заменяет его некоторой строкой замены .

1 голос
/ 05 февраля 2012

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

0 голосов
/ 05 февраля 2012

Ваши данные не могут быть декодированы в допустимые символы Unicode с использованием кодировки UTF-8. Посмотри на расшифрованную строку. Он состоит из 3 символов: 0xFFFD, 0x0068 и 0xFFFD. Первый и последний - « » - Символы замены Unicode . Я думаю, вам нужно выбрать другую кодировку. То есть «CP866» создает допустимую строку и преобразует обратно в тот же массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...