1. 程式人生 > >摩斯碼編解碼器

摩斯碼編解碼器

style param 再次 中文 通信 col 程序員 記得 ext

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

(大家猜出結語是啥了嗎?)

摩斯碼編解碼器