Я работаю над прокси-сервером. Я вкладываю данные 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[]
его проблемы причин.
Кто-то может помочь? =]
Лучший способ преобразовать байт []
в строку
и обратно в байт []
- это не делать этого вообще.
При необходимости вы должны знать кодировку, которая использовалась для создания байта []
, в противном случае операция использует кодировку платформы по умолчанию, что может повредить данные, потому что не все кодировки могут кодировать все возможные строки и не все возможные последовательности байтов допустимы во всех кодировках. Вот что происходит в вашем случае.
Что касается того, как узнать кодировку, это зависит от:
Если нет возможности узнать кодировку у вас случайный мусор, а не текстовые данные .
Вам нужно знать используемую кодировку символов, декодировать байты, используя ее, и повторно кодировать, используя ту же кодировку. Например:
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 часто будет чем-то другим. Я подозреваю, что это и есть ваша проблема.