Как бороться с огромным количеством байтовых массивов - PullRequest
0 голосов
/ 23 ноября 2018

Итак, я получаю байтовые массивы с USB-устройства (некоторые сообщения журнала) и сталкиваюсь с проблемой, я не знаю, как лучше всего их анализировать или читать ...

Итак, это получатель:

static class ReceiveLogsThread implements Runnable {
    private static final String TAG = "IoTReceiveLogsThread";
    Message msgRead;

    ReceiveLogsThread() {
    }

    public void run() {
        byte[] rbuf = new byte[4096];
        while (!Thread.currentThread().isInterrupted()) {
            try {
                int len = mSerial.readLog(rbuf, mSerialPortLog);
                if (len > 0) {
                //    Crashlytics.log(Log.DEBUG, TAG, "ReceiveLogsThread: " + printHex(rbuf));
                //    this.msgRead = receiveLogsHandler.obtainMessage(HANDLE_READ, printHex(rbuf));
                    this.msgRead = receiveLogsHandler.obtainMessage(HANDLE_READ, rbuf);
                    receiveLogsHandler.sendMessage(this.msgRead);
                }
            } catch (NullPointerException e1) {
                e1.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        Thread.currentThread().interrupt();
        if (!mReadFlag) {
            Crashlytics.log(Log.WARN, TAG, "Receive thread finished");
        }
    }
}

Как видите, метод printHex () прокомментирован, потому что я думаю, что это вызвало у меня проблему с потерей некоторых из этих сообщений из-за парсинга в реальном времени, как вы можете видетьиз его реализации

   private static String printHex(byte[] bytes) {
    Formatter formatter = new Formatter();

    for (byte b : bytes) {
        formatter.format("%02x", b);
    }
    String hex = formatter.toString();
    return hex;
}

Я не думаю, что это хорошая идея сделать метод printHex, как только я получу байтовый массив, потому что байты передаются так быстро, поэтому я хочу попробовать другой способ ...

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

Вот получениеобработчик из моей деятельности, где я храню эти массивы в список байтовых массивов, которые могут содержать как 30000 байтовых массивов:

    private List<byte[]> logs = new ArrayList<>();

Handler receiveLogsHandler = new Handler(Looper.getMainLooper()) {
    public void handleMessage(Message msgRW) {
        super.handleMessage(msgRW);
        //   logMessagesList.add(msgRW.obj.toString().toUpperCase());
        //      String message = msgRW.obj.toString().toUpperCase();

        if(shouldCollectLogs) {
            byte[] message = (byte[]) msgRW.obj;
            logs.add(message);
        }

....

Итак, проблема, с которой я здесь сталкиваюсь, заключается в том, как объединить все эти байтовые массивыв один!А затем сделайте printHex для этого одного большого массива ..

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

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

private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); 
public static String printToHex(byte[] bytes, int len) { 
    char[] hexChars = new char[len * 2]; 
    for ( int j = 0; j < len; j++ ) { 
        int v = bytes[j] & 0xFF; 
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
    }
    return new String(hexChars); 
}
0 голосов
/ 23 ноября 2018

Хорошо, вот две альтернативы для обработки окончательного списка байтовых массивов в конце, в зависимости от того, что вы хотите.

Альтернатива 1: сбор в список строк

List<String> hexStrings = listOfBytes.parallelStream() //Process in paralell each byte array
            .map(bytes -> printHex(bytes)) // Map each byte array from byte[] to String
            .collect(Collectors.toList());// Collect the streams into one final list

Альтернатива 2: собрать одну строку

String oneBigStringOfBytesInHex = listOfBytes.parallelStream() //Process in paralell each byte array
                .map(bytes -> printHex(bytes)) // Map each byte array from byte[] to String
                .collect(Collectors.joining()); // Concat the streams into one final String

Вы должны быть осторожны со вторым вариантом, вы должны учитывать, что максимальный размер строки равен 2147483647 (2 ^ 31 - 1) .В любом случае, если ваш окончательный объем данных представляет собой список из 30 000 байтовых массивов по 4096 байт каждый, у вас не должно возникнуть никаких проблем.

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