zoukankan      html  css  js  c++  java
  • 摩斯码编解码器

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

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

  • 相关阅读:
    flask2 未整理
    flask1 未整理
    libvirt创建kvm虚拟机步骤
    libvirt之 virsh命令总结
    kvm的xml文件解释
    virsh命令和调用libvirt api的区别
    KVM
    libvirt
    kvm
    oracle中正则表达式的使用
  • 原文地址:https://www.cnblogs.com/guokun/p/9845685.html
Copyright © 2011-2022 走看看