#HarmonyOS NEXT 体验官# 鸿蒙开发实战--摩斯电码 原创
作者:吴来斌
前言:摩斯电码(Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。它发明于1837年,是由美国人萨缪尔·摩尔斯等人共同发明的一种电报通信方式。
一、概论
在摩斯电码中,每一种符号(点、划)都代表一种电脉冲信号,其中“点”代表短脉冲信号,“划”代表长脉冲信号。这些脉冲信号的持续时间、间隔时间和信号间的间隔都有严格的规定,以保证信息的准确传递。摩斯电码最初是为了在电报线上传输而设计的,但随着时间的推移,它也被广泛应用于其他领域,如无线电通信、航海、紧急救援等。
摩斯电码的基本单位是点和划,每个字母或数字都由一定数量的点和划组成。例如,字母“A”在摩斯电码中表示为“·-”(一点一划),而字母“B”则表示为“-···”(一划三点)。此外,摩斯电码还包含了一些特殊符号,如“.”(点)表示句点,“- - -”(三划)表示长音或停顿等。
尽管随着现代通信技术的发展,摩斯电码已经不再是主流的通信方式,但它仍然具有一定的实用价值。例如,在紧急情况下,当其他通信方式无法使用时,摩斯电码可以作为一种备用的通信手段。此外,摩斯电码也被广泛应用于无线电爱好者、航海家、军事人员等群体中,成为一种具有特殊意义的通信方式。
二、编解码器
2.1 摩斯电码映射表
注意:当前映射表除了大写字母和数字之后,还包含常用的英文标点符号。
- 正映射表
// 摩斯电码映射表
const morseCodeMap: Record<string, string> = {
'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': '----.',
' ': '____', // 空格
'.': '.-.-.-', ',': '--..--', '?': '..--..', '\'': '.----.', '!': '-.-.--', '"': '.-..-.', '#': '..--.-', '$': '...-..-',
'%': '..-.', '&': '.-...', '(': '-.--.', ')': '-.--.-', '*': '-....-', '+': '.-.-.', '-': '-....-', '/': '-..-.',
':': '---...', ';': '-.-.-.', '=': '-...-', '@': '.--.-.', '[': '-.--.', '\\': '..-..-', ']': '-.--.-', '^': '..-.-',
'`': '.--.--', '_': '..--.-', '{': '.--.-.', '|': '|----', '}': '-.--.-', '~': '-.--.'
};
- 反映射表
// 创建一个反向映射,但请注意,如果值不唯一,这将丢失信息
const reverseMorseCodeMap: Record<string, string> = {};
// 填充反向映射
Object.keys(morseCodeMap).forEach(key => {
reverseMorseCodeMap[morseCodeMap[key]] = key; // 如果值已存在,这将覆盖之前的键
});
2.2 不含中文及中文符号
// 判断一个字符串是否包含中文字符,这里只是列举了一些常见的中文符号,你可以根据需要添加更多
export function containsChineseOrChineseSymbols(str: string): boolean {
const chineseRegex = /[\u4e00-\u9fa5,。!?、;:“”‘’()《》【】]/;
return chineseRegex.test(str);
}
2.3 编码函数
// 编码函数
export function encodeToMorse(text: string): string {
return text.toUpperCase().split('').map(char => morseCodeMap[char] || '?').join(' ');
}
2.4 解码函数
// 解码函数
export function decodeFromMorse(morse: string): string {
const words = morse.split(' ');
return words.map(word => {
return reverseMorseCodeMap[word]
}).join('');
}
三、效果预览
注意:本文目前不支持中文的摩斯电码,并且英语字母自动大写