1、背景
今天是1024,程序员节那就干点儿程序员的事情。刚好,记得上高中时候,看过一部电影,无间道,里边黄秋生和梁朝伟用摩斯码通信,瞬间觉得好神秘,好帅气。最近闲来无事,出于对当初兴趣的尊敬,就顺手实现了一款简易的摩斯编解码器。
2、编解码设计
自己玩儿,暂定中文摩斯编码。基本思想是,将汉字对应的四位区位码数字分别编码为数字对应的摩斯码,一个中文对应20位摩斯码。解码过程逆向。
3、代码实现
首先,项目结构图如下:
因为是个小工具,整个项目采用WPF实现。
主界面:
就核心过程而言,编码分两步:
1、汉字转区位码
此算法是直接抄的,原始出处,有点儿懒得费功夫找了,再次声明,不是在下原创。
////// 汉字转区位码方法 /// /// 汉字 /// 区位码 public static string ChineseToCoding(string chinese) { string pCode = ""; byte[] pArray = new byte[2]; pArray = Encoding.GetEncoding("GB2312").GetBytes(chinese);//得到汉字的字节数组 int front = (short)(pArray[0] - '\0') - 160;//将字节数组的第一位160 int back = (short)(pArray[1] - '\0') - 160;//将字节数组的第二位160 pCode = front.ToString("D2") + back.ToString("D2");//再连接成字符串就组成汉字区位码 return pCode; }
2、区位码转摩斯码
private static readonly Dictionary<string, string> _dictNumberMorse = new Dictionary<string, string> { { "0", "— — — — —"}, { "1", "· — — — —"}, { "2", "· · — — —"}, { "3", "· · · — —"}, { "4", "· · · · —"}, { "5", "· · · · ·"}, { "6", "— · · · ·"}, { "7", "— — · · ·"}, { "8", "— — — · ·"}, { "9", "— — — — ·"}, }; private static readonly Dictionary<string, string> _dictMorseNumber = new Dictionary<string, string> { { "—————", "0"}, { "·————", "1"}, { "··———", "2"}, { "···——", "3"}, { "····—", "4"}, { "·····", "5"}, { "—····", "6"}, { "——···", "7"}, { "———··", "8"}, { "————·", "9"}, }; public static string GBK2Morse(string gbkCode) { if (string.IsNullOrWhiteSpace(gbkCode) || gbkCode.Length != 4) { throw new ArgumentException($"{nameof(gbkCode)}非GBK区位码"); } StringBuilder sbMorse = new StringBuilder(); foreach (var s in gbkCode) { sbMorse.Append(_dictNumberMorse[s.ToString()]).Append(" "); } return sbMorse.ToString(); }
4、运行效果
github地址:https://github.com/KINGGUOKUN/MorseEncoder
5、结语
/ · · · · · · · · · · — — — — — · · · — — / · · — — — — — — — — — — — · · · · · — — / · · — — — — — — · · · · · · · — — — — — /1024/ · · · — — · — — — — — — · · · — · · · · / · · · — — · · — — — · · · · · · · · · — /!
(大家猜出结语是啥了吗?)