Преобразование байта [] в Строку и затем обратно к байту []

Я работаю над прокси-сервером. Я вкладываю данные byte[] который я преобразовываю в a String выполнить определенные операции. Теперь, когда я преобразовываю это новое String назад в a byte[] это вызывает неизвестные проблемы.

Так главным образом как я должен знать, как правильно преобразовать abyte[] в a String и затем обратно в a byte[] снова.

Я пытался просто преобразовать byte[] кому: String и затем обратно к byte[] снова (для проверки это - не мои операции, которые вызывают проблемы).

Таким образом, это похоже:

// where reply is a byte[]

String str= new String(reply,0, bytesRead);
streamToClient.write(str.getBytes(), 0, bytesRead);

не эквивалентно

streamToClient.write(reply, 0, bytesRead);

мой прокси хорошо работает, когда я просто отправляю byte[] без любого преобразования, но когда я преобразовываю его из byte[] к a String и затем обратно к a byte[] его проблемы причин.

Кто-то может помочь? =]

7
задан Joachim Sauer 3 May 2010 в 14:38
поделиться

2 ответа

Лучший способ преобразовать байт [] в строку и обратно в байт [] - это не делать этого вообще.

При необходимости вы должны знать кодировку, которая использовалась для создания байта [] , в противном случае операция использует кодировку платформы по умолчанию, что может повредить данные, потому что не все кодировки могут кодировать все возможные строки и не все возможные последовательности байтов допустимы во всех кодировках. Вот что происходит в вашем случае.

Что касается того, как узнать кодировку, это зависит от:

  • Если вы используете HTTP, посмотрите на заголовок Content-Type
  • Если ваши данные - XML, вы должны использовать XML синтаксический анализатор, который будет обрабатывать кодировку за вас
  • Если ваши данные представляют собой HTML-страницы, также может быть заголовок

Если нет возможности узнать кодировку у вас случайный мусор, а не текстовые данные .

9
ответ дан 6 December 2019 в 12:47
поделиться

Вам нужно знать используемую кодировку символов, декодировать байты, используя ее, и повторно кодировать, используя ту же кодировку. Например:

String str = new String(reply, 0, Charset.forName("UTF-8"));
bytes[] out = str.getBytes(Charset.forName("UTF-8"));
streamToClient.write(bytes, 0, bytes.length);

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

3
ответ дан 6 December 2019 в 12:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: