栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用java实现简易的CDMA

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用java实现简易的CDMA

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;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351824.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号