2012-04-18 5 views
0

Я преобразовываю массив byte [] в строку. А затем преобразование строки обратно в массив byte []. Тогда на проверку, если оба массива равны - Я понимаю, что они не равны:
Строка в байт и наоборот в java

byte[] ciphertext2=c.doFinal(username.getBytes("utf-8")); 
      //JUST CHECKING IGNORE 
      String qaz=new String(ciphertext2,"utf-8"); 
      //qaz=qaz+"1"; 
      System.out.println("just chekcing------------------------"+qaz); 
      byte[] ciphertext3=qaz.getBytes("utf-8"); 
      if(Arrays.equals(ciphertext2,ciphertext3)) 
      { 
      System.out.println("just chekcing they are equal------------------------"); 
      } 
      else 
      System.out.println("just chekcing they are not equal------------------------");<br> 

ВЫВОД:

just chekcing they are not equal-------------------- 


Почему не работает?
Редактировать
Он отлично работает при использовании Base64 java. Но почему это не работает, если напрямую конвертировать байты в строку и наоборот? Что на самом деле происходит при преобразовании строки в массив байтов и наоборот?

+1

Ваши байты, вероятно, недействительны utf-8. Когда они анализируются как строки utf-8, недопустимые последовательности превращаются в действительные последовательности utf-8, и поэтому массивы байтов различаются. Base64 гарантированно будет иметь значение utf-8 (это, в конце концов, надмножество ascii). – bdares

+0

@bdares: как происходит преобразование байтового массива в строку? Что происходит внутри? – Ashwin

+0

Я получаю это как истину, если я жестко кодирую значение для имени пользователя. – UVM

ответ

4

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

Вы должны использовать base64 (например, this public domain library) или, возможно, hex. Это приведет к ASCII-данным, которые гарантированно округляются до исходных двоичных данных.

+0

Как происходит преобразование байтового массива в строку? Что происходит внутри? – Ashwin

+0

@Ashwin: он использует любую кодировку, указанную, или платформу по умолчанию, если вы ее не укажете. Весь смысл кодирования состоит в том, чтобы преобразовать из байтов в текст и наоборот - точно, как это работает, зависит от реализации. Например, существуют некоторые простые кодировки (например, ASCII), где каждый байт представляет собой один символ и наоборот, но различные байты недействительны и различные символы не могут быть распознаны. Но двоичные данные, которые вы используете для построения строки, всегда должны быть байтовой последовательностью, которая * может * быть результатом кодирования некоторого текста в той же кодировке. –

+0

Итак, когда вы преобразовываете массив байтов в строку напрямую с помощью utf-8, каждый байт в массиве байтов проверяется, что он имеет соответствующий текст в отображении utf-8 и что соответствующий байт заменяется символом. Что произойдет, если отображение в utf-8 отсутствует, как это имеет место в моем случае? – Ashwin

Смежные вопросы