摩斯码编解码器

Posted guokun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了摩斯码编解码器相关的知识,希望对你有一定的参考价值。

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/     · · · — —     · — — — —     — — · · ·     — · · · ·     /     · · · — —     · · — — —     · · · · ·     · · · · —     /!

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

 

以上是关于摩斯码编解码器的主要内容,如果未能解决你的问题,请参考以下文章

福尔摩斯 argparse 模块任务

求中文摩斯密码对照表,全哦!

摩斯密码

没有意义用摩斯电码怎么说

morse_code_implementation 摩斯电码实现

python-摩斯码转换