import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
System.out.println("请输入四个码片!");
List str_list = null;
List data_list = null;
List opposite_str_list = null;
List chip_data_list = null;
List re_data = null;
str_list = cinOrthogonal();
opposite_str_list = oppositeStrList(str_list);
System.out.println("四个码片的源码:"+str_list+"n四个码片的反码:"+opposite_str_list);
System.out.println("请输入需要传输的数据:");
data_list = cinData();
System.out.println("传输的四路数据:" + data_list);
chip_data_list = chipData(str_list,data_list,opposite_str_list);
System.out.println("数据使用码片表达后:"+chip_data_list);
String send_data = sendData(chip_data_list);
System.out.println("发送的数据为"+send_data);
re_data = reData(send_data,str_list);
System.out.println("接收到的数据解码为:"+re_data);
for (int i = 0;i < re_data.size();i++)
System.out.println("第"+i+"路的数据为:"+re_data.get(i));
}
//判断String对象是否是01组成的
public static boolean isNum(String str
) {
Pattern pattern = Pattern.compile("[0-1]*");
return pattern.matcher(str).matches();
}
//判断码片是否正交
public static boolean isOrthogonal(String str_temp,String str1){
boolean isOrthogonal = false;
int sum = 0;
for (int i = 0;i < 8;i++){
sum += (Integer.valueOf(str1.charAt(i))-48) == (Integer.valueOf(str_temp.charAt(i))-48)? 1 : -1;
//三目运算两个数据相等为1,不等为-1
}
if(sum==0)isOrthogonal = true;
else System.out.println("码片不正交,重新输入!");
return isOrthogonal;
}
//输入码片
public static List cinOrthogonal() {
List str_list = new ArrayList<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 4; i++) {
while (true) { //通过break跳出while循环
String str_temp = null;
System.out.print("请输入第" + i + "个码片:");
try {
str_temp = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (isNum(str_temp) & str_temp.length() == 8) {//此处当i=0的时候把字符串加入列表
//当i!=0的时候判断是否正交
if (i == 0) ;
else {
boolean isReal = true;
for(int j = 0;j < i;j++){
if(!isOrthogonal(str_temp,str_list.get(j))){
isReal = false;
break;
}
}
if (!isReal)continue;
}
str_list.add(str_temp);
break;
}
}
}
return str_list;
}
//输入四路数据,数据长度必须相等
public static List cinData(){
List data_list = new ArrayList<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 4; i++) {
while (true) { //通过break跳出while循环
String str_temp = null;
System.out.print("请输入第" + i + "路数据:");
try {
str_temp = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(i == 0) {
data_list.add(i,str_temp);
break;
}else{
if (isNum(str_temp) & str_temp.length()
== data_list.get(0).length()) {//此处当i=0的时候把字符串加入列表
data_list.add(str_temp);
break;
}else System.out.println("数据长度不匹配!");
}
}
}
return data_list;
}
//求出反码
public static List oppositeStrList(List str_list){
List opposite_str_list = new ArrayList<>();
String temp = null;
for(int i = 0;i < 4;i++){
temp = str_list.get(i).replace("1","-1");
temp = temp.replace("0","1");
temp = temp.replace("-1","0");
opposite_str_list.add(i,temp);
}
return opposite_str_list;
}
//码片加密
public static List chipData(List str_list,
List data_list,List opposite_str_list){
List chip_data_list = new ArrayList<>();
String temp = null;
for(int j = 0;j < 4;j++) { //双循环遍历数据列表和列表中的数据并将数据通过码片加密
for (int i = 0; i < data_list.get(j).length(); i++) {
if (Integer.valueOf(data_list.get(j).charAt(i))-48 == 0)
temp = temp+opposite_str_list.get(j);
else
temp = temp+str_list.get(j);
}
temp = temp.replace("null","");
chip_data_list.add(temp);
temp = null;
}
return chip_data_list;
}
//发送的数据
public static String sendData(List chip_data_list){
String send_data = null;
int[] num_list = new int[chip_data_list.get(0).length()];
for(int j = 0;j < 4;j++) { //双循环遍历数据列表和列表中的数据并将数据通过码片加密
for (int i = 0; i < chip_data_list.get(j).length(); i++) {
num_list[i] += Integer.valueOf(chip_data_list.get(j).charAt(i))-48 == 1 ? 1:-1;
//使用三目运算符将0变成-1
}
}
StringBuffer sb = new StringBuffer();
for (int i = 0;i < num_list.length;i++)
sb.append(num_list[i]);
send_data = sb.toString();
return send_data;
}
//将String转换成数组
public static int[] changeInt(String send_data){
int[] send_data_int = new int[send_data.replace("-","").length()];
boolean judge = false;//用来判断是否为负数
int temp = 0;
for(int i = 0;i < send_data.length();i++){
if(send_data.charAt(i) == '-'){
judge = true;
temp+=1;
continue;
}
if (judge == true){
send_data_int[i-temp] = (0 - (Integer.valueOf(send_data.charAt(i))-48));
judge = false;
continue;
}
send_data_int[i-temp] = Integer.valueOf(send_data.charAt(i))-48;
}
return send_data_int;
}
//返回接受到的数据和各个码片的内积
public static List reData(String send_data,List str_list){
List re_data = new ArrayList<>();
StringBuffer sb = new StringBuffer();
int[] send_data_int = changeInt(send_data);
int temp = 0;
int sum = 0;
for (int j = 0;j < str_list.size();j++) {
temp = 0;
for (int i = 0; i < send_data_int.length; i++) {
sum += send_data_int[i] *
(Integer.valueOf(str_list.get(j).charAt(i-temp)-48)==1?1:-1);
if(i%8==7){
temp += 8;
sb.append(sum/8 == -1? 0:1);
sum = 0;
}
}
re_data.add(sb.toString());
sb.delete(0,sb.length());
}
return re_data;
}
}