Преобразование байтового массива с кодировкой ASCII в String дает странный результат - PullRequest
0 голосов
/ 12 октября 2018

Я делаю приложение на сокете в Java, которое получает некоторые данные HTML с сервера в ASCII, а затем анализирует данные соответствующим образом.

byte[] receivedContent = new byte[12500];
receivedSize = inputStream.read(receivedContent);
receivedContent = Arrays.copyOf(receivedContent, receivedSize+1);
if (receivedSize == -1) {
  System.out.println("ERROR! NO DATA RECEIVED");
  System.exit(-1);
}
lastReceived = new String(receivedContent, StandardCharsets.US_ASCII);

Это должно быть довольно просто, но это не так.Я распечатал некоторые отладочные сообщения и обнаружил, что, несмотря на получение нескольких байтов данных (для примерной печати, полученныйSize сообщает мне о полученных 784 байтах), результирующая строка из этих байтов имеет длину всего несколько символов, например:

Ard</a></li><li><a

Я ожидаю полный документ HTML, и это явно неправильно.Также нет явной картины того, когда это может произойти.Это кажется совершенно случайным.Так как я выделяю новую память для буфера, в нем действительно не должно быть старых данных, которые бы мешали новым данным из сокета.Может кто-нибудь пролить свет на это странное поведение?Кроме того, кажется, что это происходит реже на моей машине с Windows, на которой работает OracleJDK, а не на моей удаленной машине Ubunut, на которой работает OpenJDK. Может ли это быть причиной и как я могу это исправить?

ОБНОВЛЕНИЕ: в конце я проверил вручнуюASCII-кодирование байтового массива по таблице ASCII и обнаружение того, что сервер намеренно отправляет искаженные данные.Тайна раскрыта.

1 Ответ

0 голосов
/ 12 октября 2018

Вместо использования:

 inputStream.read(receivedContent);

Вам необходимо прочитать все данные из потока.Используя что-то вроде (из apache commons io):

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