如何在java中解析TLV标记字符串
我正在尝试分析TLV字符串:如何在java中解析TLV标记字符串,java,tlv,Java,Tlv,我正在尝试分析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是标记,后跟长度字段和数据。我可以使用当前的输入字符串获取所需的字段,但是可能会出现这样的情况,即标记(“9
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) {
}
}
}
}
public void bleToPos(字符串十六进制){
sb=新的StringBuilder();
tlv=新的TLVData();
int noOfCharacters=0,src=0,dest=0;
字符串epiolgue=“”,epligueData=“”;
字符串[]hexArray=hex.split(“”);
//提取前3个字节和后3个字节。后3个字节应包含90 00,否则无效字符串
epiolgue=hexArray[hexArray.length-3];
epiolgue=epiolgue+hexArray[hexArray.length-2];
epligueData=hexArray[hexArray.length-1];
如果(!epiolgue.等于(“9000”)){
System.out.println(“不是有效的tlv,无需处理”);
回来
}
tlv.setEpilogue(epligueData);
int arrayLength=hexArray.length;
如果(hexArray!=null&&hexArray.length>0){
对于(int i=0;i < p>如果我理解您的问题是正确的。当您在找到您的<代码>标签<代码>之后解析数据的<代码>长度<代码>时,可以忽略在<<代码>数据< /代码>中发生的重复< <代码>标签>代码>下一个<代码>长度>代码>字节数。ode>数据
字节。首先,您应该将输入的十六进制字符串解析为一个字节[]
。无论如何,如果输入实际上是114个十六进制数字,那么split(“”)
将不会拆分任何内容,只需返回一个元素的字符串[]
,即整个输入,以及hexArray[hexArray.length-3]
将引发异常,您的任何代码都不会运行。请重试!很抱歉我粘贴的输入字符串中没有空格。实际字符串在每个字节后都有空格,我可以拆分它。然后您应该编辑问题并显示与代码实际匹配的数据版本。TLV Decode from cryptomathic at很抱歉,解码时遇到一些错误:标记35的短值,预期长度为83974146519293757677552790141274112078567821808600920015574545401688638293030691230279723078398154628529348657308868018299,获得0 24未知标记35未知标记例如此字符串“240035E1319F080238309F370454363449DFAE0501419F260861742F754D6E4956DFAE060C3334726C5A6E6C6B75796B649F3602000190071”。标签“9F08"后面是字节02,它指定接下来的两个字节为数据,现在可能有一种情况,在这种情况下,这个标记也将是另一个标记的数据的一部分。在这种情况下,即使我读取下一个字节,我将如何区分。我有点困惑。您读取一个标记,然后读取数据的长度,现在您知道这个特定标记有多少字节的数据。只需考虑下一个<代码>长度>代码>字节数作为数据。即使在这个数据中有一个<代码>标签<代码>,你知道你不必考虑它,因为现在你正在读取数据。一旦你完成了读取数据,继续下一个标签。我创建了一个EnUM映射,它将有我感兴趣的标签,然后我循环。er字符串一次取一个字节两个字符,我检查它是否是标记,如果是,它是标记的最后一个字节,如果不是,则继续下一个字节或下两个字符。我有一个布尔变量,以查看它的标记或长度是否只是以防万一,以防止在长度的情况下检查标记。因此,当你找到标记时,你读取下两个字节的t数据长度正确吗?在读取长度后,说它是x,那么现在下一个x字节将是数据。将布尔标志设置为true,然后开始遍历字符串x字节,当布尔标志为true时,不要查找标记,最后将布尔标志设置为false,然后查找下一个标记。