摩斯码编解码器

时间:2022-07-24
本文章向大家介绍摩斯码编解码器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、背景

  今天是1024,程序员节那就干点儿程序员的事情。刚好,记得上高中时候,看过一部电影,无间道,里边黄秋生和梁朝伟用摩斯码通信,瞬间觉得好神秘,好帅气。最近闲来无事,出于对当初兴趣的尊敬,就顺手实现了一款简易的摩斯编解码器。

2、编解码设计

  自己玩儿,暂定中文摩斯编码。基本思想是,将汉字对应的四位区位码数字分别编码为数字对应的摩斯码,一个中文对应20位摩斯码。解码过程逆向。

3、代码实现

  首先,项目结构图如下:

  因为是个小工具,整个项目采用WPF实现。

主界面:

就核心过程而言,编码分两步:

1、汉字转区位码

此算法是直接抄的,原始出处,有点儿懒得费功夫找了,再次声明,不是在下原创。

 /// <summary>
        /// 汉字转区位码方法
        /// </summary>
        /// <param name="chinese">汉字</param>
        /// <returns>区位码</returns>
        public static string ChineseToCoding(string chinese)
        {
            string pCode = "";
            byte[] pArray = new byte[2];
            pArray = Encoding.GetEncoding("GB2312").GetBytes(chinese);//得到汉字的字节数组
            int front = (short)(pArray[0] - '') - 160;//将字节数组的第一位160
            int back = (short)(pArray[1] - '') - 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/ · · · — — · — — — — — — · · · — · · · · / · · · — — · · — — — · · · · · · · · · — /!

(大家猜出结语是啥了吗?)