我的递归主要实现的是从整个字符串中拿到我想要的数据,然后进行比对,然后做相应的操作。下面是相关代码:
public static void setData(byte[] totalData) { // totalData是要递归的字符串
String parameter = null;
int length = 0;
//是用来区分编号0B跟其他编号的,因为我没执行完,一个编号就要给服务期返回数的
boolean isReturn = false; String number = getAnString(totalData, 0, 1);//这是一个截取数据的方法,第一个参数是对象,第二个参数是下标位置,第三个是要截取长度 KLog.e("编号", number); length = getAnIntHex(totalData, 1, 1, 16);//同上,上面是截取后转为字符串型,这是转为整型(16进制) KLog.e("参数长度", length); parameter = convertHexToString(getAnString(totalData, 2, length)); KLog.e("参数值", parameter); int type = totalData[2]; KLog.e("类型", type); List<Parameter> parameter0B = DataSupport.findAll(Parameter.class); for (Parameter parameters : parameter0B) {//遍历数据库,这是郭霖开源的数据库 Parameter parameter1 = new Parameter();//这是获取数据库对象 StringBuffer fb = new StringBuffer(); switch (number) { case "01": isReturn = true; parameter1.setDeviceID(parameter);//设置数据 parameter1.updateAll("Uniqueness=?", "Pan"); if (parameter.equals(parameter1.getDeviceID())) {//比较判读是否保存成功 setSucceed(number, fb);//返回结果 } else { setFailure(number, fb);//返回结果 } recursion(totalData, length);//递归前判读是否还有数据,加调用自身开始递归 break; case "02": isReturn = true; parameter1.setrCode(parameter); parameter1.updateAll("Uniqueness=?", "Pan"); if (parameter.equals(parameter1.getrCode())) { setSucceed(number, fb); } else { setFailure(number, fb); } recursion(totalData, length); break; ...... 中间省略部分代码
case "0F": isReturn = true; parameter1.setScreenSize(type); parameter1.updateAll("Uniqueness=?", "Pan"); if (type == parameter1.getScreenSize()) { setSucceed(number, fb); } else { setFailure(number, fb); } recursion(totalData, length); break; default: break; } if (isReturn) { ProtocolManager.getInstance().InternetAllWriteAnswer(parameters.getDeviceID(), parameters.getrCode(), fb);//这是做一次性返回上面所有的配置结果 } } }
private static void setFailure(String number, StringBuffer fb) { fb.append(number); fb.append("00"); } private static void setSucceed(String number, StringBuffer fb) { fb.append(number); fb.append("01"); } private static void recursion(byte[] totalData, int length) { if (totalData.length - (2 + length) > 0) { byte[] data = new byte[totalData.length - (2 + length)]; System.arraycopy(totalData, 2 + length, data, 0, totalData.length - (2 + length)); KLog.e("还剩余参数", bytes2HexString(data)); if (data.length > 0) { setData(data); } } }public static String getAnString(byte[] buff, int index, int length) { return bytes2HexString(ProtocolManager.getInstance().parseParameter(buff, index, length)); }public byte[] parseParameter(byte[] receive, int index, int length) { byte[] data = new byte[length]; System.arraycopy(receive, index, data, 0, length); return data; }public static int getAnIntHex(byte[] buff, int index, int length, int radix) { return Integer.parseInt(bytes2HexString(ProtocolManager.getInstance().parseParameter(buff, index, length)), radix); }public static String convertHexToString(String hex) {//十六进制转换为字符串 StringBuilder sb = new StringBuilder(); StringBuilder temp = new StringBuilder(); //49204c6f7665204a617661 split into two characters 49, 20, 4c... for (int i = 0; i < hex.length() - 1; i += 2) { //grab the hex in pairs String output = hex.substring(i, (i + 2)); //convert hex to decimal int decimal = Integer.parseInt(output, 16); //convert the decimal to character sb.append((char) decimal); temp.append(decimal); } return sb.toString(); }//2字节byte[]转16进制字符串 public static String bytes2HexString(byte[] data) { StringBuffer sb = new StringBuffer(); String hex; for (int i = 0; i < data.length; i++) { hex = Integer.toHexString(data[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); }这只是我开发中做的笔记,大家可以作为参考就行。