前言
(1)也许前段时间你看到过一则新闻,一名学生离校出走好几天,留下一段神奇密码。家长学生一起参与破解,最终找到孩子
(2)也许你看过战争片,有些战争中仍然使用电报传输,电视中的滴答声你是否还记的
(3)也许你看过《无间道》电影,卧底在车上敲打的那些神奇传输符号;
(4)也许你听说过这么一段爱情猜谜传奇。一男子向一女子表白,女子却给了一段摩斯密码,以及很少的提示,并表示,破译这个密码,才答应和他约会。男子死活不得求解,又在百度贴吧里将密码贴出以求助网友,最终密码亦被破解,如今也被学校翻拍成了微电影。
(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”便水落石出了。
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); } }
效果如下