如何使用 Python 创建一个摩尔斯电码转换器

摩尔斯电码是一种使用点、破折号和空格对消息进行编码的方法。 它被广泛用于秘密交流消息。

您可能已经在许多电影的海军场景中看到使用摩尔斯电码来传达信息。 我们在这里讨论的是相同的莫尔斯电码,但唯一的区别是我们将编写一个 Python 程序来将英语翻译成莫尔斯电码,反之亦然。

摩尔斯电码

摩尔斯电码对每个英文字母、数字、标点符号和非拉丁字符都有不同的模式。 一旦你知道了不同字符的莫尔斯电码模式,就很容易对它们进行编码和解码。 您可以参考 Wikipedia page of morse code 了解更多细节和模式。

在本教程中,我们将学习如何将纯英文文本编码为摩尔斯电码,反之亦然。 我们将在编码解码时使用英文字母、数字和标点符号。 如果你想添加更多类型的字符,只要你了解了编码和解码的基础,你就可以轻松做到。

要记住的一件事是,大写和小写字母都具有相同的莫尔斯电码模式。 这是因为莫尔斯电码主要用于不关心字母大小写的交流,如日常对话。

让我们进入编码和解码的编码部分。

英语到摩尔斯电码

将纯英文文本转换为摩尔斯电码的算法很简单。 让我们检查一下算法。

  • 使用带有英语字母、数字和标点符号的莫尔斯电码模式映射创建字典。
  • 遍历文本并将每个文本字符的莫尔斯电码模式添加到结果中。
    • 摩尔斯电码在每个字符后包含一个空格,在每个单词后包含一个双空格。
    • 因此,当我们在文本中遇到空格,即单词的分隔符时,我们需要在结果中添加双倍空格。
  • 结果字符串将是我们需要的莫尔斯电码。
  • 最后,返回结果。
  • 尝试用 Python 编写代码。 不用担心,即使您无法完整地编写它。

    让我们检查一下将纯英文文本编码为莫尔斯电码的代码。

    # dictionary for mapping characters to morse code
    CHARS_TO_MORSE_CODE_MAPPING = {
        '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': '-----',
        '.': '.-.-.-',
        ',': '--..--',
        '?': '..--..',
        ''': '· − − − − ·',
        '!': '− · − · − −',
        '/': '− · · − ·',
        '(': '− · − − ·',
        ')': '− · − − · −',
        '&': '· − · · ·',
        ':': '− − − · · ·',
        ';': '− · − · − ·',
        '=': '− · · · −',
        '+': '· − · − ·',
        '-': '− · · · · −',
        '_': '· · − − · −',
        '"': '· − · · − ·',
        '$': '· · · − · · −',
        '@': '· − − · − ·',
    }
    
    # function to encode plain English text to morse code
    def to_morse_code(english_plain_text):
        morse_code=""
        for char in english_plain_text:
            # checking for space
            # to add single space after every character and double space after every word
            if char == ' ':
                morse_code += '  '
            else:
                # adding encoded morse code to the result
                morse_code += CHARS_TO_MORSE_CODE_MAPPING[char.upper()] + ' '
        return morse_code
    
    morse_code = to_morse_code(
        'techblik.com produces high-quality technology & finance articles, makes tools, and APIs to help businesses and people grow.'
    )
    print(morse_code)

    您可以在下面看到莫尔斯电码输出。 如果您没有更改消息,您还应该在终端中看到类似的莫尔斯电码。

    --. . . -.- ..-. .-.. .- .-. .   .--. .-. --- -.. ..- -.-. . ...   .... .. --. .... − · · · · − --.- ..- .- .-.. .. - -.--   - . -.-. .... -. --- .-.. --- --. -.--   · − · · ·   ..-. .. -. .- -. -.-. .   .- .-. - .. -.-. .-.. . ... --..--   -- .- -.- . ...   - --- --- .-.. ... --..--   .- -. -..   .- .--. .. ...   - ---   .... . .-.. .--.   -... ..- ... .. -. . ... ... . ...   .- -. -..   .--. . --- .--. .-.. .   --. .-. --- .-- .-.-.-

    欢呼! 我们得到了莫尔斯电码。 你知道接下来会发生什么。

      每个数据科学家都应该知道的 18 个基本软件

    在进入解码程序之前,让我们停下来思考一下如何编写代码来解码它。

    您应该考虑将 CHARS_TO_MORSE_CODE_MAPPING 字典作为步骤之一。 手动操作很忙,并且需要在原始映射更改时进行更新。 让我们编写代码来反转字典。

    def reverse_mapping(mapping):
        reversed = {}
        for key, value in mapping.items():
            reversed[value] = key
        return reversed

    我们只是用上面的代码反转给定字典的键值对。 结果字典将包含值是新键和键作为新值。

    我们拥有将莫尔斯电码解码为纯英文文本的所有部件。 事不宜迟,让我们解码莫尔斯电码。

    莫尔斯电码到英语

    我们可以将摩尔斯电码编码的过程逆向得到解码算法。 让我们看看将莫尔斯电码解码为纯英文文本的算法。

  • 使用我们编写的 util 函数反转 CHARS_TO_MORSE_CODE_MAPPING 字典。
  • 遍历莫尔斯电码并跟踪当前的莫尔斯电码字符。
    • 如果我们遇到一个空格,这意味着我们有一个完整的莫尔斯电码字符要解码。
      • 如果当前的莫尔斯电码字符为空并且我们有两个连续的空格,则添加一个单词分隔符,它是纯英文文本中的一个空格。
      • 如果上述条件为假,则从字典中获取解码后的字符并将其添加到结果中。 重置当前的莫尔斯电码字符。
    • 如果我们没有遇到空格,请将其添加到当前的莫尔斯字符。
  • 如果有最后一个字符,则使用字典解码后将其添加到结果中。
  • 最后返回结果。
  • 让我们检查一下上述算法的代码。

    def reverse_mapping(mapping):
        # add function code from the previous snippet...
    
    CHARS_TO_MORSE_CODE_MAPPING = {} # add dictionary values 
    MORSE_CODE_TO_CHARS_MAPPING = reverse_mapping(CHARS_TO_MORSE_CODE_MAPPING)
    
    def to_english_plain_text(morse_code):
        english_plain_text=""
    
        current_char_morse_code=""
        i = 0
        while i < len(morse_code) - 1:
            # checking for each character
            if morse_code[i] == ' ':
                # checking for word
                if len(current_char_morse_code) == 0 and morse_code[i + 1] == ' ':
                    english_plain_text += ' '
                    i += 1
                else:
                    # adding decoded character to the result
                    english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
                        current_char_morse_code]
                    current_char_morse_code=""
            else:
                # adding morse code char to the current character
                current_char_morse_code += morse_code[i]
            i += 1
    
        # adding last character to the result
        if len(current_char_morse_code) > 0:
            english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
                current_char_morse_code]
    
        return english_plain_text
    
    english_plain_text = to_english_plain_text(
        '--. . . -.- ..-. .-.. .- .-. .   .--. .-. --- -.. ..- -.-. . ...   .... .. --. .... − · · · · − --.- ..- .- .-.. .. - -.--   - . -.-. .... -. --- .-.. --- --. -.--   · − · · ·   ..-. .. -. .- -. -.-. .   .- .-. - .. -.-. .-.. . ... --..--   -- .- -.- . ...   - --- --- .-.. ... --..--   .- -. -..   .- .--. .. ...   - ---   .... . .-.. .--.   -... ..- ... .. -. . ... ... . ...   .- -. -..   .--. . --- .--. .-.. .   --. .-. --- .-- .-.-.- '
    )
    print(english_plain_text)

    我已经给出了从编码函数生成的莫尔斯电码。 如果我们运行上述程序,我们将得到以下输出。

    techblik.com PRODUCES HIGH-QUALITY TECHNOLOGY & FINANCE ARTICLES, MAKES TOOLS, AND APIS TO HELP BUSINESSES AND PEOPLE GROW.

    注意:输出是英文大写字母,因为我们在字典中使用了大写字母进行映射。

      如何在 Apache Tomcat 中实现 SSL?

    最后的话

    我们已经看到解码函数的输出是大写的。 您可以通过跟踪英文字母的大小写来使输出在给定时间内保持不变,从而改进程序。 这与摩尔斯电码无关,因为大写和小写具有相同的模式。 试试吧,因为它更有趣的编码。

    这就是本教程的内容。 下次遇到摩尔斯电码时使用我们编写的程序。

    快乐编码👨‍💻

    您还可以查看如何在 Python 中创建随机密码。