校验的算法

前提

50版本的解密算法

具体代码


        System.out.println(unpackageHEX("~50031bd0e8003e0000020102030405060708090a0b0c0c0f0f101112131415161718191a1b1c1d1e1f202122232425262728292a393b281e2f303132996135639d38393a3b82"));



public static Boolean unpackageHEX(String hex) {
        System.out.println(hex);
        int[] m_recv_buf = new int[1024];
        String[] m_recv_buf_hex = new String[1024];
        m_recv_buf[0] = '~';
        m_recv_buf_hex[0] = "~";
        int j = 1;
        for (int i = 0 ; i <(hex.length()-1)/2; i++) {
            m_recv_buf_hex[i+1] = hex.substring(j,j+2);
            m_recv_buf[i+1] = Integer.parseInt(hex.substring(j,j+2),16);
            j+=2;
        }
        String t1[] = Arrays.copyOfRange(m_recv_buf_hex, 0, (hex.length()-1)/2+1);
        int t2[] = Arrays.copyOfRange(m_recv_buf, 0, (hex.length()-1)/2+1);

        m_recv_buf_hex = t1;
        m_recv_buf = t2;

        System.out.println(Arrays.toString(m_recv_buf_hex));
        System.out.println(Arrays.toString(m_recv_buf));

        int[] hex_recv  =new int[1024];

        int lenth = m_recv_buf.length;

        int i;
        int enc_l = 0, enc_h = 0, enc_key;
        enc_key = (byte)(enc_l + enc_h);
        enc_key = (byte)(~enc_key + 1);
        int ii = 0;
        int v1, v2;
        int chksum = 0;
        int chk = 0;
        int offet = 0;
        //todo:这里存在问题,去掉eoi 和校验和即可。2个字节。于亚注释错误。
        for (i = 1; i < lenth - 1; i++) {
            v1 = m_recv_buf[i];
            chksum += v1;
            
            chksum = chksum <0?chksum & 0xff : chksum;

            hex_recv[offet++] = v1;

            if (i == 9)
            {
                enc_l = hex_recv[7];
                enc_h = hex_recv[8];
                enc_key = (enc_l + enc_h);
                enc_key = (~enc_key + 1);
            }
            if (i > 9 && hex_recv[3] == 0xd0)
            {
                hex_recv[offet-1] ^= enc_key;
                enc_key++;
            }

        }


        v1 = m_recv_buf[i];

        chk = v1;
        hex_recv[offet++] = chk;
        hex_recv[offet++] = 0x0d;

        chksum = ~chksum;
        chksum = chksum <0?chksum & 0xff : chksum;


        chksum ++;



        chksum = chksum <0?chksum & 0xff : chksum;

        System.out.println("期望:"+Integer.toHexString(chk));
        System.out.println("计算:"+Integer.toHexString(chksum));


        if (chk == chksum){
            int b[] = Arrays.copyOfRange(hex_recv, 0, offet);

            System.out.println(Arrays.toString(b));
            System.out.println(intArrayToHex(b));


            return true;
        }
        else
            return false;
    }

    public static String intArrayToHex(int[] a) {
        StringBuilder sb = new StringBuilder(a.length * 2);
        for(int b: a)
            sb.append(String.format("%02x", b));
        return sb.toString();
    }


推荐阅读更多精彩内容