Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中解析TLV标记字符串_Java_Tlv - Fatal编程技术网

如何在java中解析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

我正在尝试分析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) {

            }

        }
    }
}
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,然后查找下一个标记。