байты строки преобразуются между созданием строки и getBytes () - PullRequest
0 голосов
/ 05 сентября 2018

У меня неожиданное поведение, и мне интересно, ожидаемое ли это поведение и в чем причина этого? Я создаю новую строку, используя байтовый массив, и когда я возвращаю байтовый массив, используя ту же кодировку, байтовый массив не совпадает.

byte[] bytes = new byte[24];
new Random().nextBytes(bytes);
assertEquals( // fails
  DatatypeConverter.printHexBinary(bytes), 
  DatatypeConverter.printHexBinary(new String(bytes, UTF_8).getBytes(UTF_8))
);

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы используете случайно сгенерированные байты для создания String. Нет никакой гарантии, что эти случайно сгенерированные байты будут действительными UTF-8 (или любой другой кодировкой). Если вы посмотрите документацию String(byte[],Charset), вы увидите:

Этот метод всегда заменяет последовательности неправильно сформированного ввода и непопределяемые символы на строку замены этого набора символов по умолчанию.

Это означает, что входящие байты, если они недействительны, не обязательно будут теми же байтами, которые выходят; даже при использовании того же Charset.

0 голосов
/ 05 сентября 2018

Не каждый случайный байтовый массив является допустимым UTF-8. на самом деле, я бы сказал, что немногие из них. Таким образом, при создании строки у вас будут некоторые символы, преобразованные в U + FFFD, что сигнализирует об ошибке при определении исходных байтов. Тогда они, конечно, будут выглядеть по-разному при преобразовании обратно в байты.

Если вы хотите получить чистую информацию в оба конца, не вводите данные, которые не действительны. Или вместо этого вы можете использовать кодировку, например Latin-1, где каждый байт действителен и, следовательно, остается неизменным. Но, как правило, вставка случайных данных, не являющихся текстом, в строку редко бывает полезной или хорошей идеей. Это не C, где нет различия между двоичными данными и текстом.

...