摩斯码编解码器

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

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

原文地址:https://www.cnblogs.com/guokun/p/9845685.html

时间: 2024-10-08 19:16:59

摩斯码编解码器的相关文章

[LeetCode] 804. Unique Morse Code Words 独特的摩斯码单词

International Morse Code defines a standard encoding where each letter is mapped to a series of dots and dashes, as follows: "a"maps to ".-", "b" maps to "-...", "c" maps to "-.-.", and so on. Fo

[LeetCode] Unique Morse Code Words 独特的摩斯码单词

International Morse Code defines a standard encoding where each letter is mapped to a series of dots and dashes, as follows: "a" maps to ".-", "b" maps to "-...", "c" maps to "-.-.", and so on. F

python-摩斯码转换

意义:简单实现摩斯码的破译和生成 代码: #-*- coding: UTF-8 -*- __author__ = '007' __date__ = '2016/2/2' import pprint import re chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" codes = """.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--

【摩斯电码】我是如何通过一张小纸条渗透进了妹子的心

[摩斯电码]我是如何通过一张小纸条渗透进了妹子的心 本文来源:i春秋社区-分享你的技术,为安全加点温度 文章前介:主角:gh0stkey本人(化名:key).国外留学学生(妹子)导火线:带有印子的纸条文章导读:一张神秘的纸条出现在主角的生活之中,却让主角颠覆了"屌丝"的身份. 纸条模样还原: 因为当时没想到要拍照,就借下网图. 内容简介:事情是这样的,在一个阳光明媚的早晨,Key开始了老套的生活方式(洗脸刷牙..)上学去了....中间省略上课不听讲的趣事.只听"叮铃铃&quo

开源存在陷阱吗?摩斯拉实验室的关闭了,大家居然都不知道

根据伊恩-比克林的一篇博客,摩斯拉实验室于数月之前就关闭了,但是我们从来都没有听过关于这方面的新闻,这样很不利于互联网的发展. 很多人抗议当时谷歌实验室的关闭.我就不明白了,拥有那么多项目的一个组织,怎么可能就轻易的关掉了呢?谷歌实验室关闭之前,最起码应该告诉我一下吧.摩斯拉实验室悄悄的关闭了,官方没有给出任何说明,可是摩斯拉实验室的网站依然是可以被访问的. 该网站虽然是可以被访问的,但是当你搜索该网站时,你会发现该网站上最后一篇博客写于2013年12月份,倒数第二篇写于2013年9月. 如果你

欢迎观临,这里藏着个秘密,神秘摩斯重着盛装依旧精彩,正如期待一个有趣的灵魂,轻启the key in my hands,也许是命中注定,我们的故事始于你生日的天,每一句都动人心弦

U2FsdGVkX18+0lMfg7OQyr6pmNjcNwqAMMEA3Fa1JmGI6oTv5MuFDc5XzIA4ulelMAx/goLmuvmnzPlugbL6Qj2Ak654eQy9SNl+0ngQU2wfp9F3rpaPgpwEgy07JuKa4C6J3siqGKnxY6UlyjTy1baoUKcEQooLjHDid1tjT1QPf5Wz9nc1CL8Hdg5n7GhVbyqd+h4bJqgRF8gFQAdNqSV2dNdHR1agjbBEZno2qu7dMr5e38ePl/p+Iu

LeetCode 804 唯一摩尔斯密码词

package com.lt.datastructure.Set; import java.util.TreeSet; /* * 一个摩斯码,对应一个字母.返回我们可以获得所有词不同单词翻译的数量. * 遍历字符串,word.charAt(i)-'a'获得当前字符所对应的索引,添加到StringBuilder容器. * 用集合去重 * 返回集合size */ public class LeetCode804 { public static int uniqueMorseRepresentatio

CTF学习之CODE

今年,国内各种CTF比赛应接不暇,第一次参加CTF是因为百度举办的BCTF.当时和几个好友一起参加了,过程相当的有趣,因此走上了这条不归路. CTF真的是很考验脑力的一个东西,题目涉及的范围相当之广,每次参加CTF我都有一个很强烈的感受:知识完全不够用,还是关掉浏览器滚回去好好学习! 今天,又是SCTF开赛,排行榜上各种大神我等只能膜拜,决心好好学习,系统的学一下,今天先从CODE开始. 我想,在CTF里面比较常见的要属摩斯码了.就是由点和横线组成的特殊符号串.如下图: 图中已经给的很清楚了,对

【剧透高亮】最最最完整剧透加剧情详细解析

在美国看的,IMAX大厅爆满!只能缩在角落里的位置看,但是还是不影响观影过程,被震撼到不行!看到最后黑洞的情节都快哭出来跪在地上了!Hans Zimmer的配乐太结棍了啊! 就像诺兰所有的电影一样,Interstellar是一部烧脑+解读人性+看完后需要阅读大量相关资料补课的大片!尤其是马修麦康纳那mumbling的口音简直听得人更加confused神烦啊!伐碍紧!我们来把剧情从头到尾理一遍! OK废话不多say了,直接上剧情解析   在未来的世界,由于科技太发达,人类对于能源的过度开发导致地球