java摩斯加解密小工具

import cn.hutool.core.util.RandomUtil;

import java.util.Arrays;
import java.util.List;

public class MorseTest {
    public static void main(String[] args) {
        String sourceStr="一二三四五六七八九十工具佛IP烘干机偶数人hi噢评估师4u590235iogrhjoieagh规划日俄爱何辜iopap";
        String morse=convertStringToMorse(sourceStr);
        System.out.println(morse);
        String morseToStrResult=convertMorseToString(morse);
        System.out.println(morseToStrResult);
        System.out.println(sourceStr.equalsIgnoreCase(morseToStrResult));
    }

    //摩斯单个字的分隔
    private static final char morseSplit='/';
    //摩斯内单个字符的分隔
    private static final String morseCharSplit=".";
    //-表示2,~表示1
    private static final char[] morseCharIndex=new char[]{'-','~'};
    //随机字符串
    private static final List<String> randomStrs= Arrays.asList("#","*","@","`","$");
    //是否添加随机字符串混淆
    private static final boolean addRandomStr=false;

    public static String convertStringToMorse(String str){
        StringBuilder result=new StringBuilder();
        //1.获取字符串对应的字符数组
        char[] chars=str.toCharArray();
        //2.将字符转换为数字
        for(char c:chars){
            result.append(morseSplit);
            //3.将数字转换为摩斯字符串
            int n=(int) c;
            String s=convertIntToMorseStr(n);
            result.append(s);
        }
        return result.substring(1);
    }

    public static String convertIntToMorseStr(int num){
        StringBuilder result=new StringBuilder();
        String numStr=String.valueOf(num);
        char[] charArray=numStr.toCharArray();
        for(char c:charArray){
            result.append(morseCharSplit);
            //每一位的数值
            int n=Integer.parseInt(String.valueOf(c));
            //摩斯码1的数量
            int morse1Num=n/morseCharIndex.length;
            //摩斯码2的数量
            int morse2Num=n%morseCharIndex.length;
            for(int i=0;i<morse1Num;i++){
                if(addRandomStr){
                    boolean b=RandomUtil.randomBoolean();
                    if(b){
                        int randomIndex=RandomUtil.randomInt(0,randomStrs.size());
                        result.append(randomStrs.get(randomIndex));
                    }
                }
                result.append(morseCharIndex[0]);
            }
            for(int i=0;i<morse2Num;i++){
                if(addRandomStr){
                    boolean b=RandomUtil.randomBoolean();
                    if(b){
                        int randomIndex=RandomUtil.randomInt(0,randomStrs.size());
                        result.append(randomStrs.get(randomIndex));
                    }
                }
                result.append(morseCharIndex[1]);
            }
        }
        return result.substring(1);
    }

    public static String convertMorseToString(String morseStr){
        StringBuilder result=new StringBuilder();
        //得到每一个字
        String[] strs=morseStr.split(String.valueOf(morseSplit));
        for(String str:strs){
            int num=convertStrToNum(str);
            result.append((char)num);
        }
        return result.toString();
    }

    /**
     * 摩斯码中的单个字转换为数字
     * @param morseCharStr
     * @return
     */
    public static int convertStrToNum(String morseCharStr){
        String[] numArray=morseCharStr.split("\\"+morseCharSplit);
        StringBuilder stringBuilder=new StringBuilder();
        for(String numStr:numArray){
            char[] array=numStr.toCharArray();
            int n=0;
            for(int i=0;i<array.length;i++){
                if(array[i]==morseCharIndex[0]){
                    n=n+2;
                }else if(array[i]==morseCharIndex[1]){
                    n=n+1;
                }
            }
            stringBuilder.append(n);
        }
        //最后一位为分隔符,说明最后一位是0,但分隔不到,所以这里补一位
        if(morseCharStr.endsWith(morseCharSplit)){
            stringBuilder.append("0");
        }
        return Integer.parseInt(stringBuilder.toString());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值