Я пытаюсь разобрать строку 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) {
}
}
}
}
Извините за входную строку, я вставил ту, в которой нет пробелов. Фактическая строка имеет пробелы после каждого байта, и я могу разбить ее.
Затем вы должны отредактировать вопрос и показать версию данных, которая действительно соответствует коду.
TLV-декодирование из cryptomathic в extranet.cryptomathic.com/tlvutils/index Извините, при декодировании возникли некоторые ошибки: короткое значение для тега 35, ожидаемая длина 839741465192937576775527901412741207856782180860092001557454 5401688638293030691220 302027972308407286382930306912 302027972308407282158




Если я правильно понял ваш вопрос. Когда вы анализируете Length данных после того, как вы нашли свой Tag, вы можете игнорировать повторяющийся Tag, который встречается в Data, для следующего количества байтов Length. Учитывайте только тег, который вы найдете за пределами Length байтов Data.
Скажем, например, эту строку «240035E1319F080238309F370454363449DFAE0501419F260861742F754 D6E4956DFAE060C33347 26C5A6E6C6B75796B649 F36020001900071». За тегом "9F08" следует байт 02, который определяет следующие два байта как данные, теперь может быть случай, когда этот тег также будет частью данных другого тега, как я буду различать в этом случае, даже если я прочитаю следующий байт. Я немного смущен.
вы читаете тег, затем вы читаете длину данных, теперь вы знаете, сколько байтов данных имеется для этого конкретного тега. Просто считайте следующее количество байтов length данными. Даже если в этих данных есть tag, вы знаете, что вам не нужно его учитывать, потому что теперь вы просто читаете данные. Когда вы закончите чтение данных, перейдите к следующему тегу.
Я создал одну карту перечисления, в которой будут теги, которые меня интересуют, затем я перебираю строку, принимая по одному байту два символа за раз, и проверяю, является ли это тегом, и если да, то последний байт тега, если нет затем переходите к следующему байту или следующим двум символам. У меня есть логическая переменная, чтобы узнать, есть ли у нее тег или длина, на всякий случай, чтобы предотвратить проверку тега в случае длины.
Итак, когда вы найдете свой тег, вы прочитаете следующие 2 байта длины данных, верно? Итак, после прочтения длины скажите, что это x, так что теперь следующие x байтов будут данными. Установите для логического флага значение true и начните обход строки для x байтов, и пока логический флаг имеет значение true, не ищите теги, в конце установите для boolean flag значение false и найдите следующий тег.
Сначала вы должны проанализировать входную шестнадцатеричную строку в
byte[]. В любом случае, если на входе действительно 114 шестнадцатеричных цифр, тоsplit(" ")ничего не разделит, а просто вернетString[]одного элемента, то есть всего ввода, иhexArray[hexArray.length-3]выдаст исключение, и ни один из ваших кодов не запустится. Попробуй еще раз!