All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.codec.Morse Maven / Gradle / Ivy

Go to download

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

There is a newer version: 5.8.34
Show newest version
package cn.hutool.core.codec;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil;

/**
 * 莫尔斯电码的编码和解码实现
* 参考:https://github.com/TakWolf-Deprecated/Java-MorseCoder * * @author looly, TakWolf * @since 4.4.1 */ public class Morse { private static final Map ALPHABETS = new HashMap<>(); // code point -> morse private static final Map DICTIONARIES = new HashMap<>(); // morse -> code point /** * 注册莫尔斯电码表 * * @param abc 字母和字符 * @param dict 二进制 */ private static void registerMorse(Character abc, String dict) { ALPHABETS.put((int) abc, dict); DICTIONARIES.put(dict, (int) abc); } static { // Letters registerMorse('A', "01"); registerMorse('B', "1000"); registerMorse('C', "1010"); registerMorse('D', "100"); registerMorse('E', "0"); registerMorse('F', "0010"); registerMorse('G', "110"); registerMorse('H', "0000"); registerMorse('I', "00"); registerMorse('J', "0111"); registerMorse('K', "101"); registerMorse('L', "0100"); registerMorse('M', "11"); registerMorse('N', "10"); registerMorse('O', "111"); registerMorse('P', "0110"); registerMorse('Q', "1101"); registerMorse('R', "010"); registerMorse('S', "000"); registerMorse('T', "1"); registerMorse('U', "001"); registerMorse('V', "0001"); registerMorse('W', "011"); registerMorse('X', "1001"); registerMorse('Y', "1011"); registerMorse('Z', "1100"); // Numbers registerMorse('0', "11111"); registerMorse('1', "01111"); registerMorse('2', "00111"); registerMorse('3', "00011"); registerMorse('4', "00001"); registerMorse('5', "00000"); registerMorse('6', "10000"); registerMorse('7', "11000"); registerMorse('8', "11100"); registerMorse('9', "11110"); // Punctuation registerMorse('.', "010101"); registerMorse(',', "110011"); registerMorse('?', "001100"); registerMorse('\'', "011110"); registerMorse('!', "101011"); registerMorse('/', "10010"); registerMorse('(', "10110"); registerMorse(')', "101101"); registerMorse('&', "01000"); registerMorse(':', "111000"); registerMorse(';', "101010"); registerMorse('=', "10001"); registerMorse('+', "01010"); registerMorse('-', "100001"); registerMorse('_', "001101"); registerMorse('"', "010010"); registerMorse('$', "0001001"); registerMorse('@', "011010"); } private final char dit; // short mark or dot private final char dah; // longer mark or dash private final char split; /** * 构造 */ public Morse() { this(CharUtil.DOT, CharUtil.DASHED, CharUtil.SLASH); } /** * 构造 * * @param dit 点表示的字符 * @param dah 横线表示的字符 * @param split 分隔符 */ public Morse(char dit, char dah, char split) { this.dit = dit; this.dah = dah; this.split = split; } /** * 编码 * * @param text 文本 * @return 密文 */ public String encode(String text) { Assert.notNull(text, "Text should not be null."); text = text.toUpperCase(); final StringBuilder morseBuilder = new StringBuilder(); final int len = text.codePointCount(0, text.length()); for (int i = 0; i < len; i++) { int codePoint = text.codePointAt(i); String word = ALPHABETS.get(codePoint); if (word == null) { word = Integer.toBinaryString(codePoint); } morseBuilder.append(word.replace('0', dit).replace('1', dah)).append(split); } return morseBuilder.toString(); } /** * 解码 * * @param morse 莫尔斯电码 * @return 明文 */ public String decode(String morse) { Assert.notNull(morse, "Morse should not be null."); final char dit = this.dit; final char dah = this.dah; final char split = this.split; if (false == StrUtil.containsOnly(morse, dit, dah, split)) { throw new IllegalArgumentException("Incorrect morse."); } final List words = StrUtil.split(morse, split); final StringBuilder textBuilder = new StringBuilder(); Integer codePoint; for (String word : words) { if(StrUtil.isEmpty(word)){ continue; } word = word.replace(dit, '0').replace(dah, '1'); codePoint = DICTIONARIES.get(word); if (codePoint == null) { codePoint = Integer.valueOf(word, 2); } textBuilder.appendCodePoint(codePoint); } return textBuilder.toString(); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy