Java: читать поток байтов из сокета - PullRequest
0 голосов
/ 02 июля 2019

Я устанавливаю программное обеспечение, которое отправляет сообщение в байтах [] и получает поток байтов. Пример отправки массива

byte[] replayStatuse = new byte[] { 0x55, (byte) 0xAA, 0x0B, 0x00, 0x0A, 
0x1C, 0x03, 0x41, 0x01, 0x00 }

и я получаю нечто подобное. Я прошел тест с использованием PacketSender, и я могу видеть ответ в шестнадцатеричном формате, когда спрашиваю о статусе. Я использую

InputStream socketInputStream = socket.getInputStream();

Я уже пробовал различные методы, которые я нашел здесь в стеке и на других форумах, но он не работал. Методы как это:

int read;
while((read = socketInputStream.read(buffer)) != -1)
{
   String output = new String(buffer, 0, read);
   System.out.print(output);
   System.out.flush();
}

Я пытался использовать int read типа char, byte или другого формата, но ничего. В моей консоли печатается странный символ (U)

Я использую:

InputStream socketInputStream = socket.getInputStream();
socketInputStream.read();

Я ожидаю получить байт [] и уметь читать с помощью функции:

System.out.println(Arrays.toString(byteArray));

Так что я могу затем обрабатывать различные случаи и преобразовывать, если нужно, в String или HEX Спасибо всем

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Я не уверен, что полностью понимаю вашу проблему, но давайте попробуем

С самого начала у вас есть источник байтов, я предполагаю, что размер неизвестен.

byte[] buffer = new byte[4096]; //I assume you have something like this

//Lets use this to accumulate all the bytes from the inputstream
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();

int read;
while((read = socketInputStream.read(buffer)) != -1)
{
    byteStream.write(buffer, 0, read); //accumulates all bytes
}

byteStream.flush(); //writes out any buffered byte

byte[] allBytesRead = byteStream.toByteArray(); //All the bytes read in an array

Этоэто все байты, которые были отправлены.Допустим, вы хотите напечатать каждый байт в шестнадцатеричном формате

for(byte b : allBytesRead) {
    //might not be a good ideia if its something big. 
    //build a string with a StringBuilder instead.
    System.out.println(String.format("%02X", b));
}

Теперь вам решать, как вы будете обрабатывать эти байты.

0 голосов
/ 03 июля 2019

Символ 'U' не является странным, это символ ASCII для шестнадцатеричного значения 0x55 (т. Е. Того же, что и ваше первое значение в тестовом массиве). Следующие несколько значений в массиве могут быть выброшены из оператора print. Я рекомендую проверить / отобразить длину буфера, чтобы вы знали, сколько байтов было помещено в массив.

...