代码地址如下:
http://www.demodashi.com/demo/14743.html

详细说明:

现在这年头谍战片、警匪片动不动就用摩斯密码来传递信息,一方面可以用来耍帅,另外一方面好像不插入这样子一个情节就

显得不够专业了;那么摩斯密码(实际上应该是摩斯电码,但是不少人都喜欢把它叫做摩斯密码,这样比较有神秘感,显得高大上。)究竟是什么呢?一个不专业但是很直观的解释就是:摩斯电码是用点"."和横"-"的不同组合来表示数字和字母。

具体一点就是下图那样:

看,就是这么简单!

什么?记不住?没关系,有人总结出了一些规律来帮助记忆,

如下图:

如果你还是记不住,但是又想用拿它来发一下信息、玩一下,那你可以

自己写一个摩斯电码的解码、编码器呀。

本项目只需用到一个用于写GUI界面的第三方库wx,除去空行和注释,一共不到200行代码。

(代码在python2.7或python3.6下均能正常运行,已在以下环境中进行过测试:

python2.7 +wx2.8; python3.6 + wx4.0)

这个简易的摩斯电码编码/解码器如下:

项目结构图:

整体的项目结构十分简单,只有一个脚本文件,另外一个是根据脚本进行编译后的windows系统下的可执行程序,用户的机器甚至无需python环境便可使用,即装即用。

如下:

准备工作:

安装必要的第三方库:

 pip install wxPython

实现过程的部分代码展示

  1. 摩斯电码表实际上就是一本字典,字符\数字和电码(点划)有着一一对应的关系,

    在python中用dict来构建十分方便。

    比如,你可以用以下的方式规规矩矩地构建一个摩斯电码表.
CODE = {'A': '.-',     'B': '-...',   'C': '-.-.',
'D': '-..', 'E': '.', 'F': '..-.',
'G': '--.', 'H': '....', 'I': '..',
'J': '.---', 'K': '-.-', 'L': '.-..',
'M': '--', 'N': '-.', 'O': '---',
'P': '.--.', 'Q': '--.-', 'R': '.-.',
'S': '...', 'T': '-', 'U': '..-',
'V': '...-', 'W': '.--', 'X': '-..-',
'Y': '-.--', 'Z': '--..', '0': '-----', '1': '.----', '2': '..---',
'3': '...--', '4': '....-', '5': '.....',
'6': '-....', '7': '--...', '8': '---..',
'9': '----.'
}

你也可以用下面的方式来构建字典,

Keys = 'abcdefghijklmnopqrstuvwxyz0123456789'
Values = ['.-','-...','-.-.','-..','.','..-.','--.','....',
'..','.---','-.-','.-..','--','-.','---','.--.',
'--.-','.-.','...','-', '..-','...-','.--','-..-',
'-.--','--..','-----','.----','..---','...--',
'....-','.....','-....','--...','---..','----.']
CODE = dict(zip(Keys.upper(), Values))

然后是导入相关的库:

import wx
import os
from wx.lib.wordwrap import wordwrap
import wx.lib.dialogs

只用到一个第三方库:wxPython,该库用于编写程序的GUI.

2.编写界面:

class MainWindow(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title,size=(800,400))
font = wx.Font(15, wx.SWISS, wx.NORMAL, wx.NORMAL) self.contents = wx.TextCtrl (self,style=wx.TE_MULTILINE | wx.HSCROLL )
self.contents.SetBackgroundColour((80,180,30))
self.coder = wx.TextCtrl (self,style=wx.TE_MULTILINE | wx.HSCROLL )
self.coder.SetBackgroundColour((20,200,100)) self.msgFont = self.contents.GetFont()
self.msgColour = wx.BLACK
self.contents.SetFont(font)
self.coderFont = self.coder.GetFont()
self.coderColour = wx.BLACK
self.coder.SetFont(font) self.findData = wx.FindReplaceData() """创建状态栏"""
self.CreateStatusBar() """file菜单布局"""
filemenu = wx.Menu()
menuNew = filemenu.Append(wx.ID_NEW ,"&New\tCtrl+N","New a file 新建")
menuOpen = filemenu.Append(wx.ID_OPEN ,"&Open\tCtrl+O","Open a file 打开")
menuSave = filemenu.Append(wx.ID_SAVE ,"&Save\tCtrl+S","Save the file 保存") """菜单分隔线"""
filemenu.AppendSeparator()
menuExit = filemenu.Append(wx.ID_EXIT ,"E&xit\tCtrl+Q","Tenminate the program 退出") """格式菜单布局"""
formatmenu = wx.Menu ()
menuMsgFont = formatmenu.Append(wx.ID_ANY ,"&msg Font","Set the message font 设置输入字体")
menuCoderFont = formatmenu.Append(wx.ID_ANY ,"&coder Font","Set the coder font 设置输出字体") """帮助菜单布局"""
helpmenu = wx.Menu ()
menuhelpdoc = helpmenu.Append(wx.ID_ANY ,"usage\tF1","usage 使用说明") """菜单栏布局"""
menuBar = wx.MenuBar ()
menuBar.Append(filemenu,"&File")
menuBar.Append(formatmenu,"&Setup")
menuBar.Append(helpmenu,"&Help")
self.SetMenuBar(menuBar) """创建按钮"""
encoderButton = wx.Button (self,label = 'Encode')
decoderButton = wx.Button (self,label = 'Decode') """函数绑定"""
self.Bind(wx.EVT_MENU,self.OnExit,menuExit)
self.Bind(wx.EVT_MENU,self.OnOpen,menuOpen)
self.Bind(wx.EVT_MENU,self.OnSave,menuSave)
self.Bind(wx.EVT_MENU,self.OnNew,menuNew) self.Bind(wx.EVT_MENU,self.OnSelectFont,menuMsgFont)
self.Bind(wx.EVT_MENU,self.OnSelectCoderFont,menuCoderFont) self.Bind(wx.EVT_MENU,self.Onhelpdoc,menuhelpdoc) self.Bind(wx.EVT_BUTTON,self.Encode,encoderButton)
self.Bind(wx.EVT_BUTTON,self.Decode,decoderButton) """布局"""
self.sizer0 = wx.BoxSizer (wx.HORIZONTAL ) self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
self.sizer2.Add(encoderButton, 1, wx.EXPAND)
self.sizer2.Add(decoderButton, 1, wx.EXPAND) self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.sizer0, 0, wx.EXPAND)
self.sizer.Add(self.contents, 1, wx.EXPAND)
self.sizer.Add(self.coder, 1, wx.EXPAND)
self.sizer.Add(self.sizer2, 0, wx.EXPAND) self.SetSizer(self.sizer)
self.SetAutoLayout(1)
self.sizer.Fit(self) """显示布局"""
self.Show(True)

3.接下来编写各种回调函数,

有时候信息太长,不好一一输进输入框,也懒得复制粘贴,

因此可以写一个函数用以打开文本:

    """Open 函数"""
def OnOpen(self,event):
self.dirname=''
dlg = wx.FileDialog(self,"choose a file",self.dirname,"","*.*",wx.FD_DEFAULT_STYLE )
if dlg.ShowModal()==wx.ID_OK :
self.filename = dlg.GetFilename()
self.dirname = dlg.GetDirectory()
f = open(os.path.join(self.dirname,self.filename),'r')
self.contents.SetValue(f.read())
f.close()
dlg.Destroy()

与之类似,可以编写一个用以保存编码/解码信息的函数.

摩斯电码的点和划有时候看上去好像是字符画,

因此可以写一个设置字体大小、样式和颜色的函数.

    """设置contents字体 """
def OnSelectFont(self, evt):
msg = self.contents.GetValue()
data = wx.FontData()
data.EnableEffects(True)
data.SetColour(self.msgColour) # set colour
data.SetInitialFont(self.msgFont) dlg = wx.FontDialog(self, data) if dlg.ShowModal() == wx.ID_OK:
data = dlg.GetFontData()
font = data.GetChosenFont()
colour = data.GetColour() self.msgFont = font
self.msgColour = colour
self.contents.SetFont(self.msgFont)
self.contents.SetForegroundColour(self.msgColour)
dlg.Destroy()

4.编写解码函数将输入的摩斯电码转为数字和字符:

    def Decode(self,event):

        Decode_value = CODE.keys()
Decode_key = CODE.values()
Decode_dict = dict(zip(Decode_key,Decode_value)) msg = self.contents.GetValue()
self.coder.Clear()
msg1 = msg.split()
text = []
for str in msg1:
if str in Decode_dict.keys():
text.append(Decode_dict[str])
self.coder.write("%s " % (text))

与之类似,参考可以编码函数编写一个编码函数将输入的字符和数字转为摩斯电码.

python实现的摩斯电码解码\编码器

代码地址如下:
http://www.demodashi.com/demo/14743.html

python实现的摩斯电码解码\编码器的更多相关文章

  1. 实验吧-密码学-try them all(加salt的密码)、robomunication(摩斯电码)、The Flash-14(闪电侠14集)

    try them all(加salt的密码) 首先,要了解什么事加salt的密码. 加salt是一种密码安全保护措施,就是你输入密码,系统随机生成一个salt值,然后对密码+salt进行哈希散列得到加 ...

  2. [CTF]摩斯电码

    摩尔斯电码 -----------转载 https://morse.supfree.net/ 摩尔斯电码定义了包括:英文字母A-Z(无大小写区分)十进制数字0-9,以及"?"&qu ...

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

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  4. Javascript实现摩斯码加密解密

    原文地址 作者:liaoyu 摩尔斯电码是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母.数字和标点符号,是由美国人萨缪尔·摩尔斯在1836年发明. 每一个字符(字母或数字)对应不同的 ...

  5. uva 508 - Morse Mismatches(摩斯码)

    来自https://blog.csdn.net/su_cicada/article/details/80084529 习题4-6 莫尔斯电码(Morse Mismatches, ACM/ICPC Wo ...

  6. 摩尔斯电码(Morse Code)Csharp实现

    摩尔斯电码,在早期的"生产斗争"生活中,扮演了很重要的角色,作为一种信息编码标准,摩尔斯电码拥有其他编码方案无法超越的长久生命.摩尔斯电码在海事通讯中被作为国际标准一直使用到199 ...

  7. Python中进行Base64编码和解码

    Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...

  8. 算法提高 9-3摩尔斯电码 map

    算法提高 9-3摩尔斯电码 时间限制:1.0s   内存限制:256.0MB     问题描述 摩尔斯电码破译.类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文.请不要使用"z ...

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

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

随机推荐

  1. 领扣-754 到达终点数字 Reach a Number MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. LeakCanary 内存泄漏 监测 性能优化 简介 原理 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  3. neo4j的配置文件(图文详解)

    不多说,直接上干货! 前期博客 Ubuntu16.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐) Ubuntu14.04下Neo4j图数据库官网安装部署步骤(图文详解)(博主推荐) ...

  4. PHP 使用PHPExcel删除Excel单元格指定列

    需求是这样的: 有一个系统仅公司内部和外部经销商使用,在一个导出功能中公司内部员工跟外部经销商导出的列是不一样的(某些数据是不能提供给经销商的) 因为导出的数据都是一样的(某些列外数据外部没有)因此并 ...

  5. OnBecameVisible和OnBecameInvisible ,OnWillRenderObject

    OnBecameVisible 和 OnBecameInvisible ,OnWillRenderObject 只有在所挂物体(不包括子物体)有render才有效 //可见 private void ...

  6. (转)最近一个项目中关于NGUI部分的总结(深度和drawCall)

    在自己最近的一个项目中,软件的界面部分使用了NGUI来进行制作.在制作过程中,遇到了一些问题,也获取了一些经验,总结下来,作为日后的积累. 1.NGUI图集的使用. 此次是第一个自己正儿八经的制作完整 ...

  7. Mac关闭摄像头

    为了防止黑客入侵,我们可以手动执行命令,关掉摄像头设备的访问权限,让黑客去看黑夜吧. Mac关闭禁用摄像头的方法,打开终端,拷贝如下代码,回车,输入管理员密码,再次拷贝,回车. sudo chmod ...

  8. 启动项目时出现Not a JAR.......Find JAR........一指循环就是起不来

    出现问题原因就是mapper的映射文件有问题,里面的返回类型如是实体找不到或者找重复的就会这样 解决办法就是:确保在用的实体(路径)能找到,切记不能有重名的实体

  9. 【Nodejs】外研社一年级起各年级英语音频下载(缺456年级上)

    在 https://news.21cnjy.com/A/130/235/V729768.shtml 有各年级英语音频下载,用爬虫把能下的都下了,除了四五六年级上册的. 爬虫 http://www.cn ...

  10. .NET 基于任务的异步模式(Task-based Asynchronous Pattern,TAP) async await

    本文内容 概述 编写异步方法 异步程序中的控制流 API 异步方法 线程 异步和等待 返回类型和参数 参考资料 下载 Demo 下载 Demo TPL 与 APM 和 EAP 结合(APM 和 EAP ...