我的遞歸主要實現的是從整個字符串中拿到我想要的數據,然後進行比對,然後做相應的操作。下面是相關代碼:
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(); }這只是我開發中做的筆記,大家可以作爲參考就行。