编辑代码

import java.io.ByteArrayInputStream;
class Main {
	public static void main(String[] args) {
        ByteArrayInputStream in = new ByteArrayInputStream(new File("D://safecomp_top_cg_20240604_mg_11501029.bin"))
        
        crc();
    }
    public static void back(String str){
        System.out.println("-----------返回响应-----------:");
        str = "d0eb900390c0000010015539ff00c00b00100000000e9d9c305a62";
        str = str.toUpperCase();
        System.out.println("密管指令:"+str.substring(0,2));
        System.out.println("包头固定:"+str.substring(2,18));
        System.out.println("返回指令码:"+str.substring(18,20));
        System.out.println("返回结果:"+str.substring(20,22));
    }
    public static void paramConfig(String str){
        System.out.println("-----------参数配置传输-----------:");
        System.out.println("密管指令:"+str.substring(0,2));
        System.out.println("包头固定:"+str.substring(2,18));
        System.out.println("指令码:"+str.substring(18,22));
        int head = 22;
        System.out.println("防重放Key:"+str.substring(head,head+16));
        System.out.println("防重放Len:"+str.substring(head+16,head+16+8));
        Integer fcf = Integer.parseInt(str.substring(head+16,head+16+8),16)*2;
        System.out.println("防重放value:"+str.substring(head+16+8,head+16+8+fcf));
        int head2 = head+16+8+fcf;
        System.out.println("内网ipKey:"+str.substring(head2,head2+16));
        System.out.println("内网ipLen:"+str.substring(head2+16,head2+16+8));
        Integer fcf2 = Integer.parseInt(str.substring(head2+16,head2+16+8),16)*2;
        System.out.println("内网ipvalue:"+str.substring(head2+16+8,head2+16+8+fcf2));
        System.out.println("内网ip明文:"+hexToString(str.substring(head2+16+8,head2+16+8+fcf2)));
        
        int head3 = head2+16+8+fcf2;
        System.out.println("外网ipKey:"+str.substring(head3,head3+16));
        System.out.println("外网ipLen:"+str.substring(head3+16,head3+16+8));
        Integer fcf3 = Integer.parseInt(str.substring(head3+16,head3+16+8),16)*2;
        System.out.println("外网ipvalue:"+str.substring(head3+16+8,head3+16+8+fcf3));
        System.out.println("外网ip明文:"+hexToString(str.substring(head3+16+8,head3+16+8+fcf3)));

        int head4 = head3+16+8+fcf3;
        System.out.println("态感系统ipKey:"+str.substring(head4,head4+16));
        System.out.println("态感系统ipLen:"+str.substring(head4+16,head4+16+8));
        Integer fcf4 = Integer.parseInt(str.substring(head4+16,head4+16+8),16)*2;
        System.out.println("态感系统ipvalue:"+str.substring(head4+16+8,head4+16+8+fcf4));
        System.out.println("态感系统ip明文:"+hexToString(str.substring(head4+16+8,head4+16+8+fcf4)));

        int head5 = head4+16+8+fcf4;
        System.out.println("星座系统ipKey:"+str.substring(head5,head5+16));
        System.out.println("星座系统ipLen:"+str.substring(head5+16,head5+16+8));
        Integer fcf5 = Integer.parseInt(str.substring(head5+16,head5+16+8),16)*2;
        System.out.println("星座系统ipvalue:"+str.substring(head5+16+8,head5+16+8+fcf5));
        System.out.println("星座系统ip明文:"+hexToString(str.substring(head5+16+8,head5+16+8+fcf5)));

        int head6 = head5+16+8+fcf5;
        System.out.println("密管系统ipKey:"+str.substring(head6,head6+16));
        System.out.println("密管系统ipLen:"+str.substring(head6+16,head6+16+8));
        Integer fcf6 = Integer.parseInt(str.substring(head6+16,head6+16+8),16)*2;
        System.out.println("密管系统ipvalue:"+str.substring(head6+16+8,head6+16+8+fcf6));
        System.out.println("密管系统ip明文:"+hexToString(str.substring(head6+16+8,head6+16+8+fcf6)));
    }
    public static void sendFile(){
        System.out.println("-----------文件传输-----------:");
        String str = "d0eb90039f8418024100007a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a31313131316d6d6d7a7a7a7a03aa";
        str = str.toUpperCase();
        System.out.println("总厂:"+str.length()/2);
        System.out.println("密管指令:"+str.substring(0,2));
        System.out.println("标识符:"+str.substring(2,6));
        System.out.println("版本号+类型+副导头标识+应用过程标识:"+str.substring(6,10));
        System.out.println("分组标识+源包计数:"+str.substring(10,14));
        System.out.println("分组标识+源包计数:"+Integer.toBinaryString(Integer.parseInt(str.substring(10,14),16)));
        System.out.println("数据长度:"+str.substring(14,18));
        System.out.println("段号:"+str.substring(18,22));
        System.out.println("数据:"+str.substring(22,22+576*2));
        System.out.println("数据长度:"+str.substring(22,22+576*2).length());
        System.out.println("crc:"+str.substring(22+576*2,str.length()));


    }
    public static void commonStr(String str){
        String a = str.substring(0,2);
        System.out.println("版本号:"+a);
        System.out.println("安全模式:"+str.substring(2,4));
        System.out.println("保留:"+str.substring(4,8));
        System.out.println("消息ID:"+str.substring(8,24));
        System.out.println("PDU长度:"+str.substring(24,32));
        System.out.println("目的方id:"+str.substring(32,96));
        System.out.println("目的方id:"+hexToString(str.substring(32,96)));
        System.out.println("发送方id:"+str.substring(96,160));
        System.out.println("发送方id:"+hexToString(str.substring(96,160)));
        System.out.println("操作类型:"+str.substring(160,162));
        System.out.println("pdu消息:"+str.substring(162,(Integer.parseInt(str.substring(24,32),16))*2+162));
        System.out.println("pdu消息长度:"+(Integer.parseInt(str.substring(24,32),16)));
        System.out.println("MAC:"+str.substring((Integer.parseInt(str.substring(24,32),16))*2+162,str.length()));
    }

    public static void startSend(String str){
        System.out.println("-----------开始传输-----------:");
        str = "D0EB900390C0000010015539ff00C01C001000000006755Cf363fef5";
        str = str.toUpperCase();
        System.out.println("密管指令:"+str.substring(0,2));
        System.out.println("包头固定:"+str.substring(2,18));
        handleHeader(str.substring(2,18));
        System.out.println("指令码:"+str.substring(18,22));
        System.out.println("重构设备标识:"+str.substring(22,24));
        System.out.println("文件类型:"+str.substring(24,26));
        System.out.println("文件子类型:"+str.substring(26,28));
        System.out.println("文件分段标识+文件段数:"+str.substring(28,32));
        System.out.println("文件长度:"+str.substring(32,40));
        System.out.println("尾端长度:"+str.substring(40,48));
        System.out.println("CRC:"+str.substring(48,52));
        System.out.println("校验和:"+str.substring(52,56));
    }
    public static String stringTransHex(String str){
        StringBuilder sb = new StringBuilder();
        sb.append("0x");
        for( int i=0;i<str.length();i++){
            if(i != 0 && (i%2 == 0)){
                sb.append(",0x");
            }
            sb.append(str.substring(i,i+1));
        }
        return sb.toString();
    }
    public static String hexToString(String hex) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hex.length(); i += 2) {
            String str = hex.substring(i, i + 2);
            char chr = (char) Integer.parseInt(str, 16);
            sb.append(Character.toString(chr));
        }
        return sb.toString();
    }

    public static void handleHeader(String hexStr){
    System.out.println("数据域长度:"+hexStr.substring(12,16));
    }
    
    public static byte[] hexStringToByteArray(String s) {
         int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }

    public static String crc(byte []data){
        int wcrcin = 0xffff;
        int wcploy = 0x1021;
        for(byte b : data){
            for(int i=0;i<8;i++){
                boolean bit = ((b >> (7 -i )&1) == 1);
                boolean c15 = ((wcrcin >>  15 & 1) == 1);
                wcrcin <<= 1;
                if (c15 ^ bit){
                    wcrcin ^= wcploy;
                }
            }
        }
        wcrcin &= 0xffff;
        return Integer.toHexString(wcploy ^= 0x0000);
    }
}