专栏首页销声匿迹摩斯码编解码器

摩斯码编解码器

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • asp.net web api集成微信服务(使用Senparc微信SDK)

    guokun
  • Dapper关联查询

    guokun
  • Core + Vue 后台管理基础框架0——开篇

      最近,打算新开个项目,鉴于团队技术栈,选型.net core + vue,前后端分离。本打算捡现成的轮子的,github上大致逛了逛,总发现这样那样的不太适...

    guokun
  • Hive 创建和生成Rcfile 和SequenceFile格式的表

    rcfile格式表需要从原始的textfile 文件格式表导出数据并导入到新建好的rcfile格式表里

    sanmutongzi
  • ShareSDK第三方分享与登录遇到的问题

    LeeCen
  • PDO::quote讲解

    PDO::quote — 为SQL语句中的字符串添加引号。(PHP 5 = 5.1.0, PECL pdo = 0.2.1)

    砸漏
  • php实现的生成排列算法示例

    砸漏
  • 两条命令助你成为优秀的 YAML 工程师

    我们在编写 Kubernetes 资源清单的时候可能会经常会忘记要创建的资源名称,即使知道了可能也不记得该资源对象有哪些属性可以使用了,特别是对于那些名称很长的...

    我是阳明
  • 对象存储 Node.js SDK cos-nodejs-sdk-v5 Typescript 声明文件

    用到腾讯云对象存储,使用Node.js SDK cos-nodejs-sdk-v5,没有 typescript 的声明文件,自己写了一个。

    苦少
  • RTSP协议视频智能分析/内容识别平台EasyNVR安防视频云服务关于POST接口C#调用的例子介绍说明

    TSINGSEE青犀视频云边端架构视频智能分析平台EasyNVR、EasyCVR等具备视频流拉取、转码、分发的功能,并且我们提供丰富的API接口进行二次开发。

    EasyNVR

扫码关注云+社区

领取腾讯云代金券