文章目錄
- 前言
- 摩爾斯電碼
- Python實現
- 摩斯密碼對照表
- 加密
- 解密
- 測試
- 完整代碼
- 總結
- 關于Python技術儲備
- 一、Python所有方向的學習路線
- 二、Python基礎學習視頻
- 三、精品Python學習書籍
- 四、Python工具包+項目源碼合集
- ①Python工具包
- ②Python實戰案例
- ③Python小游戲源碼
- 五、面試資料
- 六、Python兼職渠道
前言
在電影《無間道》中,劉建明(劉德華飾)作為黑幫的臥底在一次行動中發現了警察的臥底陳永仁(梁朝偉飾)與黃警督(黃秋生飾)通過摩斯電碼進行通訊,經過緊急的群發區域短信 “有內鬼,終止交易” 避免了黑幫頭目被抓。
通過動圖能看到黃警督和陳永仁僅通過手指的敲擊就能完成通訊,是不是很神奇?
摩爾斯電碼
摩斯密碼的定義如下:
摩爾斯電碼( 又譯為摩斯密碼,英語:Morse code)是一種時通時斷的信號代碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號。是由美國人艾爾菲德·維爾與薩繆爾·摩爾斯在1836年發明。
摩爾斯電碼是一種早期的數碼化通信形式,它依靠一系列的點和劃來傳遞編碼信息,它的代碼包括五種:
- 點( · ):1 (讀 “滴” dit ,時間占據1t )
- 劃(—):111 (讀 “嗒” dah ,時間占據3t )
- 字符內部的停頓(在點和劃之間):0 (時間占據1t )
- 字符間停頓:000 ( 時間占據3t )
- 單詞間的停頓:0000000 ( 時間占據7t )
點的長度(也就是上面的時間長度t)決定了發報的速度。
我們的英文字母、數字和標點符號與摩斯密碼的對照圖如下:
我們現在要發送 “M O R S E(空格) C O D E” (morse code)這單詞,通過查表可知,它應該是這樣
—— ——— ·—· ··· · / —·—· ——— —·· ·
對應的報文應該如下(滴 表示敲擊,? 表示停頓)
滴滴滴?滴滴滴???滴滴滴?滴滴滴?滴滴滴???滴?滴滴滴?滴???滴?滴?滴???滴???????滴滴滴?滴?滴滴滴?滴???滴滴滴?滴滴滴?滴滴滴
是不是很有意思?
Python實現
用 Python 實現摩斯密碼的加解密,其實很簡單,只需要把對照表放在一個字典中,加密的時候將明文拆分,然后從字典中取出對應的密碼組合在一起,解密的時候就是通過密文去對照表找對應的明文,然后拼在一起就行。
摩斯密碼對照表
我們把摩斯密碼對照表用字典存儲之后,是這樣的:
MORSE\_CODE\_DICT = {'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': '--..', '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----', ', ': '--..--', '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-', '(': '-.--.', ')': '-.--.-'}
加密
加密的過程就是將明文通過對照表翻譯成密文的過程。
我們逐個讀取明文,如果是字母、數字或者標點符號就到字典里面找對應的密碼,字符之間用空格隔開,如果是單詞之間的空格,就添加兩個連續空格,以隔開單詞。
加密過程的代碼如下:
def encrypt(message):cipher = ''for letter in message:if letter != ' ':# 查字典并添加對應的摩斯密碼# 用空格分隔不同字符的摩斯密碼cipher += MORSE\_CODE\_DICT\[letter\] + ' 'else:# 1個空格表示不同的字符# 2表示不同的詞cipher += ' 'return cipher
解密
在解密的情況下,我們首先在要解碼的字符串末尾添加一個空格,我們從字符串中提取字符。
一旦我們得到一個空格,我們就會在提取的字符序列(或我們的莫爾斯電碼)中查找相應的英語字符,并將其添加到將存儲結果的變量中。
一旦我們得到 2 個連續的空格,我們就會向包含解碼字符串的變量添加另一個空格。
字符串末尾的最后一個空格將幫助我們識別莫爾斯電碼字符的最后一個序列。
解密過程的代碼如下:
# 將字符串從摩斯解密為英文的函數
def decrypt(message):# 在末尾添加額外空間以訪問最后一個摩斯密碼message += ' 'decipher = ''citext = ''global ifor letter in message:# 檢查空間if letter != ' ':i = 0# 在空格的情況下citext += letter# 在空間的情況下else:# 如果 i = 1 表示一個新字符i += 1# 如果 i = 2 表示一個新單詞if i == 2:# 添加空格來分隔單詞decipher += ' 'else:# 使用它們的值訪問密鑰(加密的反向)decipher += list(MORSE\_CODE\_DICT.keys())\[list(MORSE\_CODE\_DICT.values()).index(citext)\]citext = ''return decipher
測試
我們先來測試一下加密算法:
message = "I LOVE YOU"
result = encrypt(message.upper())
print(result)
運行結果是:
… .-… — …- . -.-- — …-
大家可以自己對照著映射表來看看是否正確。
再測試一下解密算法:
message = ".. .-.. --- ...- . -.-- --- ..-"
result = decrypt(message)
print(result)
運行結果是:
I LOVE YOU
完整代碼
#!/usr/bin/env python3
# -\*- coding: utf-8 -\*-
"""
@author: 閑歡
"""# 表示摩斯密碼圖的字典
MORSE\_CODE\_DICT = {'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': '--..','1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....','7': '--...', '8': '---..', '9': '----.', '0': '-----',', ': '--..--', '.': '.-.-.-', '?': '..--..', '/': '-..-.', '-': '-....-','(': '-.--.', ')': '-.--.-'}# 根據摩斯密碼圖對字符串進行加密的函數
def encrypt(message):cipher = ''for letter in message:if letter != ' ':# 查字典并添加對應的摩斯密碼# 用空格分隔不同字符的摩斯密碼cipher += MORSE\_CODE\_DICT\[letter\] + ' 'else:# 1個空格表示不同的字符# 2表示不同的詞cipher += ' 'return cipher# 將字符串從摩斯解密為英文的函數
def decrypt(message):# 在末尾添加額外空間以訪問最后一個摩斯密碼message += ' 'decipher = ''citext = ''global ifor letter in message:# 檢查空間if letter != ' ':i = 0# 在空格的情況下citext += letter# 在空間的情況下else:# 如果 i = 1 表示一個新字符i += 1# 如果 i = 2 表示一個新單詞if i == 2:# 添加空格來分隔單詞decipher += ' 'else:# 使用它們的值訪問密鑰(加密的反向)decipher += list(MORSE\_CODE\_DICT.keys())\[list(MORSE\_CODE\_DICT.values()).index(citext)\]citext = ''return decipherdef main():message = "I LOVE YOU"result = encrypt(message.upper())print(result)message = ".. .-.. --- ...- . -.-- --- ..-"result = decrypt(message)print(result)# 執行主函數
if \_\_name\_\_ == '\_\_main\_\_':main()
總結
整個摩斯密碼加密和解密的過程就是對字符串的操作,還比較簡單。但是想想那些特務啥的通過敲擊聲或者其他方式去人工解密,還是有點技術難度的。這個加解密的程序給自己玩玩還是不錯的,你覺得呢?
關于Python技術儲備
學好 Python 不論是就業還是做副業賺錢都不錯,但要學會 Python 還是要有一個學習規劃。最后大家分享一份全套的 Python 學習資料,給那些想學習 Python 的小伙伴們一點幫助!
微信掃描下方CSDN官方認證二維碼免費領取【保證100%免費
】

一、Python所有方向的學習路線
Python所有方向的技術點做的整理,形成各個領域的知識點匯總,它的用處就在于,你可以按照上面的知識點去找對應的學習資源,保證自己學得較為全面。
二、Python基礎學習視頻
② 路線對應學習視頻
還有很多適合0基礎入門的學習視頻,有了這些視頻,輕輕松松上手Python~在這里插入圖片描述
③練習題
每節視頻課后,都有對應的練習題哦,可以檢驗學習成果哈哈!
因篇幅有限,僅展示部分資料
三、精品Python學習書籍
當我學到一定基礎,有自己的理解能力的時候,會去閱讀一些前輩整理的書籍或者手寫的筆記資料,這些筆記詳細記載了他們對一些技術點的理解,這些理解是比較獨到,可以學到不一樣的思路。
四、Python工具包+項目源碼合集
①Python工具包
學習Python常用的開發軟件都在這里了!每個都有詳細的安裝教程,保證你可以安裝成功哦!
②Python實戰案例
光學理論是沒用的,要學會跟著一起敲代碼,動手實操,才能將自己的所學運用到實際當中去,這時候可以搞點實戰案例來學習。100+實戰案例源碼等你來拿!
③Python小游戲源碼
如果覺得上面的實戰案例有點枯燥,可以試試自己用Python編寫小游戲,讓你的學習過程中增添一點趣味!
五、面試資料
我們學習Python必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有阿里大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
六、Python兼職渠道
而且學會Python以后,還可以在各大兼職平臺接單賺錢,各種兼職渠道+兼職注意事項+如何和客戶溝通,我都整理成文檔了。
這份完整版的Python全套學習資料已經上傳CSDN,朋友們如果需要可以微信掃描下方CSDN官方認證二維碼免費領取【保證100%免費
】
