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);
}
}