Java_摩尔斯密码 非常详细
生活随笔
收集整理的這篇文章主要介紹了
Java_摩尔斯密码 非常详细
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
查看原文:http://www.ibloger.net/article/19.html
前言
(1)也許前段時間你看到過一則新聞,一名學生離校出走好幾天,留下一段神奇密碼。家長學生一起參與破解,最終找到孩子
(2)也許你看過戰爭片,有些戰爭中仍然使用電報傳輸,電視中的滴答聲你是否還記的
(3)也許你看過《無間道》電影,臥底在車上敲打的那些神奇傳輸符號;http://v.youku.com/v_show/id_XMTY3MDc3MTg0.html
(4)也許你聽說過這么一段愛情猜謎傳奇。一男子向一女子表白,女子卻給了一段摩斯密碼,以及很少的提示,并表示,破譯這個密碼,才答應和他約會。男子死活不得求解,又在百度貼吧里將密碼貼出以求助網友,最終密碼亦被破解,如今也被學校翻拍成了微電影。http://v.youku.com/v_show/id_XMjMwNDYxNjQ0.html
(5)你是否想過使用2個按鈕來控制整個鍵盤輸入,如今Google研發的Gmail Tap 摩斯密碼輸入法已經成為現實
其實摩爾斯電碼并不怎么難,只有簡單的 2種 符號表示推薦一個短教學?http://v.youku.com/v_show/id_XNTEyNjczNTA0.html, 接下來一起了解學習
摩爾斯電碼
摩爾斯電碼(Morse alphabet)(又譯為摩斯電碼)是一種時通時斷的信號代碼,這種信號代碼通過不同的排列順序來表達不同的英文字母、數字和標點符號等。由美國人摩爾斯(Samuel Finley Breese Morse)于1837年發明,為摩爾斯電報機的發明(1835年)提供了條件。?由點dot(.)、劃dash(-)兩種符號組成,摩爾斯碼在早期無線電上舉足輕重,是每個無線電通訊者所須必知的。由于通訊號技術之進步,各國已于1999年停止使用摩爾斯碼,但由于它所占的頻寬最少,又具一種技術及藝術的特性,在實際生活中有廣泛的應用。摩爾斯電碼morse code 它由兩種基本信號和不同的間隔時間組成:短促的點信號“·”,讀“的”(Di);保持一定時間的長信號“—”,讀“答”(Da) 雖然摩爾斯發明了電報,但他缺乏相關的專門技術。他與艾爾菲德·維爾簽定了一個協議,讓他幫自己制 摩爾斯電碼
造更加實用的設備。艾爾菲德·維爾構思了一個方案,通過點、劃和中間的停頓,可以讓每個字元和標點符號彼此獨立地發送出去。他們達成一致,同意把這種標識不同符號的方案放到摩爾斯的專利中。這就是現在我們所熟知的美式摩爾斯電碼,它被用來傳送了世界上第一條電報。這種代碼可以用一種音調平穩時斷時續的無線電信號來傳送,通常被稱做連續波(Continuous Wave),縮寫為CW。它可以是電報電線里的電子脈沖,也可以是一種機械的或視覺的信號(比如閃光)。作為一種信息編碼標準,摩爾斯電碼擁有其他編碼方案無法超越的長久的生命。摩爾斯電碼在海事通訊中被作為國際標準一直使用到1999年。1997年,當法國海軍停止使用摩爾斯電碼時,發送的最后一條消息是:“所有人注意,這是我們在永遠沉寂之前最后的一聲吶喊!”做為一種實際上已經絕跡的電碼,美式摩爾斯電碼使用不太一樣的點、劃和獨特地間隔來表示數字、字
摩爾斯電碼手表
元和特殊符號。這種摩爾斯電碼的設計主要是針對地面報務員通過電報電線傳輸的,而非通過無線電波。這種古老的、交錯的電碼是為了配合報務員接聽方式而設計的。可以從揚聲器或者耳機中聽到電碼的音調,你只能從這些最早期的電報機的一個機械發生裝置聽到嗒嗒的聲音,甚至是從發送電鍵接聽:這種電鍵在不發送信號時被設置為從動模式,負責發聲
字母
| 字符 | 電碼符號 | 字符 | 電碼符號 | 字符 | 電碼符號 | 字符 | 電碼符號 |
| 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 | ━ ━ ━ ━ . | ? | ? | ? | ? |
數字短碼
| 字符 | 電碼符號 | 字符 | 電碼符號 | 字符 | 電碼符號 | 字符 | 電碼符號 |
| 0 | — | 1 | ● — | 2 | ● ● — | 3 | ● ● ●— — |
| 4 | ● ● ● ● — | 5 | ● ● ● ● ● | 6 | — ● ● ● ● | 7 | — —● ● ● |
| 8 | — ● ● | 9 | — ● | ? | ? | ? | ? |
標點符號
| 字符 | 電碼符號 | 字符 | 電碼符號 | 字符 | 電碼符號 | 字符 | 電碼符號 |
| . | .━.━ .━ | : | ━ ━ ━... | , | ━ ━..━ ━ | ; | ━.━ .━. |
| ? | ..━ ━.. | = | ━ ...━ | ' | .━ ━ ━ ━ . | / | ━..━ . |
| ! | ━.━ .━ ━ | ━ | ━....━ | _ | ..━ ━.━ | " | .━ ..━. |
| ( | ━ .━ ━ . | ) | ━.━ ━.━ | $ | ...━ ..━ | & | .... |
| @ | .━ ━.━ . | + | .━.━. | ? |
特殊符號
這是一些有特殊意義的點劃組合。它們由二個字母的摩爾斯電碼連成一個使用,這樣可以省去正常時把它們做為兩個字母發送所必須的中間間隔時間。 AR:·—·—·(停止,消息結束) AS:·—···(等待) K:—·—(邀請發射信號)(一般跟隨AR,表示“該你了”) SK:···—·—(終止,聯絡結束) BT:—···—(分隔符) ···—·(我將重新發送最后一個單詞) ·· ··(同樣) ········(錯誤)常用縮寫
縮寫和同一符號不同,縮寫保留著字元中間的間隔,它們并沒有被連成一個使用。 A - All after (問號后用于請求重復) AB - All before (同樣) ARRL - American Radio Relay League(美國無線電中繼聯盟) ABT - About(關于) ADS - Address(地址) AGN - Again(再一次) ANT - Antenna (天線) BN - All between(之間的所有) BUG - Semiautomatic key(半自動的關鍵) C - Yes(是,好) CBA - Callbook address(呼號手冊) CFM - Confirm(確認) CLG - Calling(撥打) CQ - Calling any station(連絡任一站臺) CUL - See you later(待會見) CUZ - Because(因為) CW - Continuous wave(連續波) CX - Conditions(狀況) DE - From(來自) DX - Distance (sometimes refers to long distance contact)(長程通訊) ES - And (和) FB - Fine business (類似于“確定”) FCC - Federal Communications Commission(美國聯邦通信委員會) FER - For (為了) FREQ - Frequency(頻率) GA - Good afternoon or Go ahead (depending on context)(午安) GE - Good evening(晚安) GM - Good morning(早安) GND - Ground (ground potential)(地表) GD - Good(好) HI - Laughter(笑;笑聲) HR - Here(這里) HV - Have(有) LID - Poor operator(可憐的運營商) MILS - Milliamperes(毫安) NIL - Nothing(無) NR - Number(編號) OB - Old boy(老男孩) OC - Old chap(老兄) OM - Old man (any male amateur radio operator is an OM)(任何男性業余無線電操作員是一個OM) OO - Official Observer (官方觀察員) OP - Operator(操作員) OT - Old timer(老手) OTC - Old timers club (老前輩俱樂部) OOTC - Old old timers club (老老前輩俱樂部) PSE - Please(請) PWR - Power(功率) QCWA - Quarter Century Wireless Association (四分之一世紀無線協會) R I - acknowledge or decimal point (承認或小數點)(根據上下文確定) RCVR - Receiver(接收器) RPT - Repeat or report)(重復或報告)(根據上下文確定) RST - Signal report format (Readability-Signal Strength-Tone)(收訊指標) RTTY - Radio teletype (無線電電傳) RX - Receive(接收) SAE - Self addressed envelope (自我處理的信封) SASE - Self addressed, stamped envelope (自我解決,蓋章信封) SED - Said(說) SEZ - Says (說) SIG - Signal(訊號) SIGS - Signals (信號) SKED - Schedule(行程) SN - Soon(很快=不久將來) SOS -(緊急呼救=國際通用) SRI - Sorry(抱歉) STN - Station(電臺) TEMP - Temperature(氣溫) TMW - Tomorrow(明日) TNX - Thanks(感謝) TU - Thank you(感謝你) TX - Transmit(發射器) U - You (你) UR - Your or you're (您或您已經)(根據上下文確定) URS - Yours (你的) VY - Very (非常) WDS - Words (詞) WKD - Worked (工作) WL - Will (將) WUD - Would (會) WX - Weather(天氣) XMTR - Transmitter(發射機) XYL - Wife(妻子) YL - Young lady (used of any female)(年輕女子) 73 - Best regards(最好的祝福) 88 - Love and kisses(愛與吻之告別)(注意應該使用在“異性”之間) 99 - go away(被要求離開,非友善)誕生愛情
早已被新科技所取代的摩斯密碼,在中國的互聯網世界里演繹了一段費盡周折的愛情猜謎傳奇。一男子向一女子表白,女子卻給了一段摩斯密碼,以及很少的提示,并表示,破譯這個密碼,才答應和他約會。男子死活不得求解,又在百度貼吧里將密碼貼出以求助網友,最終密碼亦被破解。
神秘的摩斯密碼 “****-/*---- /----*/****-/****-/*----/---**/*----/****-/*----/-****/***--/****-/*---- /----*/**---/-****/**---/**---/***--/--***/****-/”。這便是愛情摩斯密碼的原樣。摩斯密碼對應的是英文字母和數字。然而,事情顯然沒有這么簡單。 謎底“I LOVE YOU TOO” 片羿天使在下面網友的跟貼催促下,晚上20點02分第207樓再次出現,并且道出了摩斯密碼的答案,也給出了解答的步驟,此時這則帖子的跟貼已經到了第7 頁。片羿天使從摩斯密碼推到數字,再從數字推到了手機鍵盤和電腦鍵盤,然后重新排序排列,再倒換,“I LOVE YOU TOO”便水落石出了。[1]Java代碼
雖然網上,手機上已經有很多摩斯密碼轉換工具,還是自己動手寫了一個,高手請沉默就行了,我這里使用的字符轉化大小寫,其實無所謂,如果需要中文輸入,可以借助ASCII碼。(1) 新建一個摩斯密碼對照表的ContrastList類,存儲符號,若要添加其他特殊符號可以另行添加。 package cryptology;import java.util.HashMap; import java.util.Map;/*** 摩爾斯對照表* @author小奎*/ public class ContrastList {Map<Character, String> maplist = new HashMap<Character, String>();// 摩爾斯編碼表集合public ContrastList() {maplist.put('A', "●-");maplist.put('B', "-●●●");maplist.put('C', "-●-●");maplist.put('D', "-●●");maplist.put('E', "●");maplist.put('F', "●●-●");maplist.put('G', "--●");maplist.put('H', "●●●●");maplist.put('I', "●●");maplist.put('G', "●---");maplist.put('K', "-●-");maplist.put('L', "●-●●");maplist.put('M', "--");maplist.put('N', "-●");maplist.put('O', "---");maplist.put('P', "●--●");maplist.put('Q', "--●-");maplist.put('R', "●-●");maplist.put('S', "●●●");maplist.put('T', "-");maplist.put('U', "●●-");maplist.put('V', "●●●-");maplist.put('W', "●--");maplist.put('X', "-●●-");maplist.put('Y', "-●--");maplist.put('Z', "--●●");/* 數字電碼0-9 */maplist.put('0', "-----");maplist.put('1', "●----");maplist.put('2', "●●---");maplist.put('3', "●●●--");maplist.put('4', "●●●●-");maplist.put('5', "●●●●●");maplist.put('6', "-●●●●");maplist.put('7', "--●●●");maplist.put('8', "---●●");maplist.put('9', "----●");/* 標點符號,可自增刪 */maplist.put(',', "--●●--"); // ,逗號maplist.put('.', "●-●-●-"); // .句號maplist.put('?', "●●--●●"); // ?問號maplist.put('!', "-●-●--"); // !感嘆號maplist.put('\'', "●----●");// '單引號maplist.put('\"', "●-●●-●");// "引號maplist.put('=', "-●●●-"); // =等號maplist.put(':', "---●●●"); // :冒號maplist.put(';', "-●-●-●"); // ;分號maplist.put('(', "-●--●"); // (前括號maplist.put(')', "-●--●-"); // )后括號maplist.put(' ', "★"); // 留空格,這里的星號是自定義的}}
(2)Main方法測試 package cryptology;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 摩斯密碼測試* @author 小奎*/ public class Main {char plaintext[]; // 明文String ciphertext[]; // 密文StringBuffer plainStr = new StringBuffer(" "); // 明文字符串StringBuffer cipherStr = new StringBuffer(" "); // 密文字符串// 實例化對照表對象ContrastList C = new ContrastList();Map<Character, String> maplist = C.maplist;public static void main(String[] args) {System.out.println("************ 歡迎使用摩爾斯電碼程序 **************");Main m = new Main();m.init(); // 初始化m.Encryption(); // 加密m.Decryption(); // 解密}void init(){System.out.println("請輸入一段明文:");BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));while (true) {// 正則驗證 字母/數字/空格 , . ? + \ / : ; ! = ( )Pattern p =Pattern.compile("^[\\s,\\w,\\.,\\?,\\+,:,;,!,',\",=,\\(,\\)]+$"); String str;try {str = bf.readLine();Matcher m= p.matcher(str);if(m.find()){plaintext = str.toUpperCase().toCharArray(); // 將輸入字符轉換大寫數組字符類型break;}} catch (IOException e) {} System.out.println("未按規則輸入..請重新輸入..");}}/*** 加密*/void Encryption(){for(int i=0; i<plaintext.length; i++){char tmp = plaintext[i];/* 字母 */if(maplist.containsKey(tmp))cipherStr.append(maplist.get(tmp)).append(" "); // 追加空格}ciphertext = cipherStr.toString().split(" ");System.out.println("加密后:"+cipherStr);}/*** 解密*/void Decryption(){for(int i=1; i<ciphertext.length; i++){String tmp = ciphertext[i];/* 字母 */if(maplist.containsValue(tmp)){for (Entry<Character, String> s : maplist.entrySet()) {if(tmp.equals(s.getValue())){plainStr.append(s.getKey().toString().toLowerCase());}}}}System.out.println("解密后:"+plainStr);} }
效果如下
謝謝!
總結
以上是生活随笔為你收集整理的Java_摩尔斯密码 非常详细的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抽象代数入门(一)
- 下一篇: opencv学习(二十四)之腐蚀与膨胀