[.NET][C#]密碼學(Morse Code)

Morse Code摩斯電碼,嚴格說起來不算密碼,19世紀美國Samuel Morese於1836年發明,一直是海事通訊中國際標準。

通常用一種音調平穩"時斷時續"的無線電信號傳送,也可以是一種機械的或視覺的信號(比如閃光),學知識兼練C#語法。

 

我們來試看看用Console Beep聲響作出摩斯電碼,首先需要先理解編碼方式,下表為常用英數字。

  • (1)點:1個時間單位 Dit
  • (2)劃:3個時間單位 Dah
  • (3)點劃之間: 1個時間單位
  • (4)字母間隔: 3個時間單位
  • (5)單字之間隔:7個時間單位

1.先將常用文字編碼寫成字典

public Dictionary<char, string> MorseCodeDictionary = new Dictionary<char, 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' , "----."},
        {'.' , ".-.-.-"},
        {':' , "---..."},
        {',' , "--..--"},
        {';' , "-.-.-."},
        {'?' , "..--.."},
        {'=' , "-...-"},
        {'/' , "-..-."},
        {'!' , "-.-.--"},
    };

2.Parse輸入字串發出Dit/Dah聲音。

 void MorseBeep(string MorseCode)
 {

     int freq = 1000;
     //1個時間單位0.2秒
     int duration = 200;
     foreach (char c in MorseCode.ToUpper())
     {
         char PrevCode = ' ';
         foreach (var Code in MorseCodeDictionary[c])
         {
             //(3)
             if (!PrevCode.Equals(Code) && !' '.Equals(Code))
             {
                 System.Threading.Thread.Sleep(duration);
             }
             PrevCode = Code;
             //(1)Dit
             if (Code.Equals('.'))
             {
                 Console.Beep(freq, duration);
             }
             //(2)Dah
             else if (Code.Equals('-'))
             {
                 Console.Beep(freq, duration * 3);
             }
         }
         //(4)Letter Interval
         System.Threading.Thread.Sleep(duration * 3);
     }

 }

3.測試方法:

SOS求救:Save Our Ship

MorseBeep("SOS!");

 

然後MBP就發出求救訊號了!

 

1912年鐵達尼號Titanic發出求救訊號:

TITANIC.jpg

記憶方式:

參考:

Samuel Morse

Morse Code

SOS

C# Basics: Morse Code Converter Using Dictionaries

摩斯電碼記憶方式