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());
}
}
java摩斯加解密小工具
最新推荐文章于 2024-10-04 20:20:08 发布