Как разобрать строку тега TLV в Java

Я пытаюсь разобрать строку TLV:

24 00 35 E1 31 9F 08 02 38 30 9F 37 04 4A 66 6B 69 DF AE 05 01 41 9F 26 08 73 30 35 76 4F 6A 36 4E DF AE 06 0C 33 34 71 76 69 70 6B 4D 53 63 66 55 9F 36 02 00 01 90 00 7B

В этом случае 9F08 - это тег, за которым следует поле длины и данные. Я могу получить необходимые поля с текущей входной строкой, которая у меня есть, но может быть сценарий, в котором тег («9F08») также может находиться в части данных другого поля. Я не понимаю, что делать дальше.

public void bleToPos(String hex) {
    sb=new StringBuilder();
    tlv=new TLVData();
    int noOfCharacters=0,src=0,dest=0;
    String epiolgue = "",epligueData = "";

    String [] hexArray=hex.split(" ");
    //Extract 1st 3 bytes and last 3 bytes. last 3 bytes should contain 90 00 otherwise not valid string
    epiolgue=hexArray[hexArray.length-3];
    epiolgue= epiolgue + hexArray[hexArray.length-2];
    epligueData = hexArray[hexArray.length-1];
    if (!epiolgue.equals("9000")) {
        System.out.println(" Not a valid tlv no need to process");
        return;
    }
    tlv.setEpilogue(epligueData);
    int arrayLength=hexArray.length;
    if (hexArray!=null && hexArray.length>0) {
        for(int i=0;i<hexArray.length;i++) {
            try {
                if (hexArray[i].equals("9F")) {
                    if ((i+1)<arrayLength &&  hexArray[i+1].equals("08")) {
                        noOfCharacters= (char)Integer.parseInt(hexArray[i+2], 16);
                        src=i+3;
                        dest=src+noOfCharacters;
                        copyArrayElementsIntoString(src, dest, hexArray);
                        tlv.setVersion(sb.toString());
                        sb.setLength(0);
                    }
                    else if ((i+1)<arrayLength && hexArray[i+1].equals("37")) {
                        noOfCharacters= (char)Integer.parseInt(hexArray[i+2], 16);
                        src=i+3;
                        dest=src+noOfCharacters;
                        copyArrayElementsIntoString(src, dest, hexArray);
                        tlv.setDssid(sb.toString());
                        sb.setLength(0);
                    }
                    else if ((i+1)<arrayLength && hexArray[i+1].equals("26")) {
                        noOfCharacters= (char)Integer.parseInt(hexArray[i+2], 16);
                        src=i+3;
                        dest=src+noOfCharacters;
                        copyArrayElementsIntoString(src, dest, hexArray);
                        tlv.setMac(sb.toString());
                        sb.setLength(0);
                    }
                    else if ((i+1)<arrayLength && hexArray[i+1].equals("36")) {
                        noOfCharacters= (char)Integer.parseInt(hexArray[i+2], 16);
                        src=i+3;
                        dest=src+noOfCharacters;
                        copyArrayElementsIntoString(src, dest, hexArray);
                        tlv.setAtc(sb.toString());
                        sb.setLength(0);
                    }
                    i=dest-1;
                    src=0;
                    dest=0;
                    continue;

                }
                if (hexArray[i].equals("DF")) {
                    if ((i+1)<arrayLength && hexArray[i+1].equals("AE")) {

                        if ((i+2)<arrayLength && hexArray[i+2].equals("05")) {
                            noOfCharacters= (char)Integer.parseInt(hexArray[i+3], 16);
                            src=i+4;
                            dest=src+noOfCharacters;
                            copyArrayElementsIntoString(src, dest, hexArray);
                            tlv.setCvb(sb.toString());
                            sb.setLength(0);
                        }
                        else if ((i+2)<arrayLength && hexArray[i+2].equals("06")) {
                            noOfCharacters= (char)Integer.parseInt(hexArray[i+3], 16);
                            src=i+4;
                            dest=src+noOfCharacters;
                            copyArrayElementsIntoString(src, dest, hexArray);
                            tlv.setToken(sb.toString());
                            sb.setLength(0);
                        }

                    }
                    i=dest-1;
                    src=0;
                    dest=0;
                    continue;
                }
                /*if (hexArray[i].equals("90")) {
                    if ((i+1)<arrayLength && hexArray[i+1].equals("00")) {

                    }
                }*/

            }catch(Exception e) {

            }

        }
    }
}

Сначала вы должны проанализировать входную шестнадцатеричную строку в byte[]. В любом случае, если на входе действительно 114 шестнадцатеричных цифр, то split(" ") ничего не разделит, а просто вернет String[] одного элемента, то есть всего ввода, и hexArray[hexArray.length-3] выдаст исключение, и ни один из ваших кодов не запустится. Попробуй еще раз!

Andreas 12.03.2018 18:16

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

Kaka 12.03.2018 18:51

Затем вы должны отредактировать вопрос и показать версию данных, которая действительно соответствует коду.

Andreas 12.03.2018 21:41

TLV-декодирование из cryptomathic в extranet.cryptomathic.com/tlvutils/index Извините, при декодировании возникли некоторые ошибки: короткое значение для тега 35, ожидаемая длина 839741465192937576775527901412741207856782180860092001557454‌ 5401688638293030691220 302027972308407286382930306912‌ 302027972308407282158

Orlay Garcia Duconge 10.12.2019 17:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 126
1

Ответы 1

Если я правильно понял ваш вопрос. Когда вы анализируете Length данных после того, как вы нашли свой Tag, вы можете игнорировать повторяющийся Tag, который встречается в Data, для следующего количества байтов Length. Учитывайте только тег, который вы найдете за пределами Length байтов Data.

Скажем, например, эту строку «240035E1319F080238309F370454363449DFAE0501419F260861742F754‌ D6E4956DFAE060C33347‌ 26C5A6E6C6B75796B649‌ F36020001900071». За тегом "9F08" следует байт 02, который определяет следующие два байта как данные, теперь может быть случай, когда этот тег также будет частью данных другого тега, как я буду различать в этом случае, даже если я прочитаю следующий байт. Я немного смущен.

Kaka 13.03.2018 20:20

вы читаете тег, затем вы читаете длину данных, теперь вы знаете, сколько байтов данных имеется для этого конкретного тега. Просто считайте следующее количество байтов length данными. Даже если в этих данных есть tag, вы знаете, что вам не нужно его учитывать, потому что теперь вы просто читаете данные. Когда вы закончите чтение данных, перейдите к следующему тегу.

Sam 13.03.2018 20:58

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

Kaka 16.03.2018 20:54

Итак, когда вы найдете свой тег, вы прочитаете следующие 2 байта длины данных, верно? Итак, после прочтения длины скажите, что это x, так что теперь следующие x байтов будут данными. Установите для логического флага значение true и начните обход строки для x байтов, и пока логический флаг имеет значение true, не ищите теги, в конце установите для boolean flag значение false и найдите следующий тег.

Sam 16.03.2018 22:45

Другие вопросы по теме