Заставить итератор перейти на нужную позицию - PullRequest
0 голосов
/ 23 апреля 2020

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

List<Integer> a = new ArrayList<Integer>();
    for (int i = 0; i < file.length(); i++)
        a.add(i);

Iterator<Integer> it = a.iterator(); 

int messageLength = 125;

while (it.hasNext()) {
    System.out.println("Number of Arguments: " + (int) b[it.next()]);
    payload = Arrays.copyOfRange(b, it.next(), messageLength);
    System.out.println("PAYLOAD: " + readPayload(payload));
}

Например, я хочу изменить значение it.next(), чтобы по истечении времени он мог начать читать следующее сообщение из индекса с количество (it.next() + messageLength). Например, когда начинается второе время, мой it.next() должен начинаться с 126 вместо 2.

Есть ли у вас какие-либо идеи, как мне этого добиться или я должен полностью отказаться от Итератора? Я совершенно новичок в java и программировании, я был бы очень признателен за любую помощь.

Заранее спасибо.

edit:

My full " Основная «часть программы» указана ниже. Я пытаюсь создать инструмент для чтения журналов DLT (Diagnosti c, Log and Trace) для извлечения и манипулирования указанной информацией (например, для создания статистики).

Документация, за которой я следую, здесь (обратите внимание, что при чтении из файла кодировка начинается на стр. 59, а затем продолжается на стр. 16).

Мне удалось создать некоторые функции, которые получают информацию на основе документации, мне удается читать только первое сообщение, потому что мне нужно манипулировать it.next() или синтаксическим анализатором / итератором для перехода с самого начала некоторых других сегментов. Я больше ищу что-то, что может непрерывно перебирать множество векторов (после того, как один закончится, следующий должен быть в состоянии продолжить там, где остановился другой, или что-то в этом роде).

Я знаю, что это скорее сложнее топи c чем я просил ранее (и мне жаль). Кроме того, поскольку мой код не работает должным образом, я не выделил время для его форматирования :(. (b - это файл, переведенный в байтовый массив с использованием commons.io)

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

public static void main(String[] args) {

        final File file = new File("C:\\Users\\liosim\\Documents\\Domain-test\\Diag\\src\\wavalogs.dlt");
        List<Integer> a = new ArrayList<Integer>();
        for (int i = 0; i < file.length(); i++)
            a.add(i);

        Iterator<Integer> it = a.iterator(); 


        try {
            InputStream inputStream = new FileInputStream(file);

            byte[] b = IOUtils.toByteArray(inputStream);


            byte[] payload;

            int messageLength;

            inputStream.close();
            while (it.hasNext()) {
                System.out.println(readDLTPattern(b[it.next()], b[it.next()], b[it.next()], b[it.next()]));
                System.out.println("Timestamp sconds: " + fourBytesToUInt32LittleEndian(b[it.next()], b[it.next()], b[it.next()], b[it.next()]));
                System.out.println("Timestamp miliseconds: " + fourBytesToUInt32LittleEndian(b[it.next()], b[it.next()],    b[it.next()], b[it.next()]));
                System.out.println("ECU ID: " + fourBytesTo4AsciiChars(b[it.next()], b[it.next()], b[it.next()], b[it.next()]));

                readHeaderType(b[it.next()]);
                System.out.println("Message counter: " + readMessageCounter(b[it.next()]));
                messageLength = (int) twoBytesToUInt16BigEndian(b[it.next()], b[it.next()]);
                System.out.println("Length: " + messageLength + 
                        "\nECU ID: " + fourBytesTo4AsciiChars(b[it.next()], b[it.next()], b[it.next()], b[it.next()])
                        + "\nSESSION ID: " + fourBytesToUInt32BigEndian(b[it.next()], b[it.next()], b[it.next()], b[it.next()])
                        + "\nTimestamp miliseconds: " + fourBytesToUInt32BigEndian(b[it.next()], b[it.next()], b[it.next()], b[it.next()]));

                readMessageInfo(b[it.next()]);
                System.out.println("Number of Arguments: " + (int) b[it.next()]);               
                System.out.println("APID: " + fourBytesTo4AsciiChars(b[it.next()], b[it.next()], b[it.next()], b[it.next()]));
                System.out.println("CTID: " + fourBytesTo4AsciiChars(b[it.next()], b[it.next()], b[it.next()], b[it.next()]));


                payload = Arrays.copyOfRange(b, it.next(), messageLength + 15);

                System.out.println("PAYLOAD: " + readPayload(payload)
                        + "\n------------------------------------------------------------------------");
                System.out.println(it.next());
                break;
            }

        } catch (Exception e1) {
            e1.printStackTrace();
        }

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