《摩斯密码(Morse code) C#实现》
摩斯密码(Morse Code)作为一种经典的电报通信编码方式,自19世纪发明以来,广泛应用于航海、航空、军事及业余无线电领域。其通过点(·)、划(-)和空格的组合表示字母、数字及标点符号,具有简单高效的特点。本文将详细探讨如何使用C#(.NET)实现摩斯密码的编码与解码功能,涵盖基础实现、扩展功能及优化策略,为开发者提供完整的解决方案。
一、摩斯密码基础与编码规则
摩斯密码由国际标准(ITU)定义,包含26个英文字母、10个数字及常用标点符号。每个字符对应唯一的点划组合,例如:
- A: ·-
- B: -···
- 数字5: ·····
- 标点?: ..--..
编码时需注意:
- 字符间用单个空格分隔
- 单词间用3个空格分隔
- 点与划的持续时间比通常为1:3
二、C#基础实现:编码与解码
1. 编码器实现
首先构建字符到摩斯码的映射字典,然后实现文本到摩斯码的转换逻辑。
using System;
using System.Collections.Generic;
using System.Text;
public class MorseCodeConverter
{
private static readonly Dictionary MorseDict = new Dictionary
{
{'A', ".-"}, {'B', "-..."}, {'C', "-.-."}, {'D', "-.."}, {'E', "."},
{'F', "..-."}, {'G', "--."}, {'H', "...."}, {'I', ".."}, {'J', ".---"},
// 省略其他字母...
{'0', "-----"}, {'1', ".----"}, {'2', "..---"}, {'3', "...--"}, {'4', "....-"},
// 省略其他数字...
{' ', "/"} // 单词分隔符
};
public static string Encode(string text)
{
var morseBuilder = new StringBuilder();
text = text.ToUpperInvariant(); // 统一大写
foreach (char c in text)
{
if (MorseDict.TryGetValue(c, out string morseChar))
{
morseBuilder.Append(morseChar).Append(" ");
}
else if (char.IsWhiteSpace(c))
{
morseBuilder.Append(" "); // 单词间隔
}
// 忽略无效字符
}
return morseBuilder.ToString().Trim();
}
}
2. 解码器实现
解码需反向处理摩斯码到字符的映射,同时处理空格分隔的逻辑。
public static string Decode(string morseCode)
{
var reverseDict = new Dictionary();
foreach (var kvp in MorseDict)
{
reverseDict[kvp.Value] = kvp.Key;
}
var morseChars = morseCode.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
var textBuilder = new StringBuilder();
foreach (string morseChar in morseChars)
{
if (morseChar == "/") // 单词分隔
{
textBuilder.Append(" ");
}
else if (reverseDict.TryGetValue(morseChar, out char c))
{
textBuilder.Append(c);
}
// 忽略无效摩斯码
}
return textBuilder.ToString();
}
三、进阶功能实现
1. 音频输出支持
通过System.Media.SystemSounds或NAudio库生成摩斯码音频。
using System.Threading;
using NAudio.Wave;
public class MorseAudioGenerator
{
private const int DotDurationMs = 100;
private const int DashDurationMs = 300;
private const int LetterSpaceMs = 300;
private const int WordSpaceMs = 700;
public static void PlayMorse(string morseCode)
{
var provider = new SignalGenerator()
{
Frequency = 800,
Gain = 0.5,
Type = SignalGeneratorType.Sin
};
using var waveOut = new WaveOutEvent();
waveOut.Init(provider);
waveOut.Play();
foreach (char symbol in morseCode)
{
switch (symbol)
{
case '.':
provider.Frequency = 800;
Thread.Sleep(DotDurationMs);
provider.Frequency = 0; // 静音
Thread.Sleep(DotDurationMs); // 点间间隔
break;
case '-':
provider.Frequency = 800;
Thread.Sleep(DashDurationMs);
provider.Frequency = 0;
Thread.Sleep(DotDurationMs); // 划间间隔
break;
case ' ':
Thread.Sleep(symbol == ' ' && morseCode.IndexOf(symbol, 1) == ' '
? WordSpaceMs : LetterSpaceMs);
break;
}
}
waveOut.Stop();
}
}
2. 图形化界面实现
使用WPF创建交互式编码/解码工具:
// MainWindow.xaml.cs
private void EncodeButton_Click(object sender, RoutedEventArgs e)
{
OutputText.Text = MorseCodeConverter.Encode(InputText.Text);
}
private void DecodeButton_Click(object sender, RoutedEventArgs e)
{
OutputText.Text = MorseCodeConverter.Decode(InputText.Text);
}
四、性能优化与错误处理
1. 字典初始化优化
使用静态构造函数避免重复初始化:
public static class MorseUtils
{
private static readonly Dictionary EncodeDict;
private static readonly Dictionary DecodeDict;
static MorseUtils()
{
EncodeDict = new Dictionary
{
// 初始化编码字典...
};
DecodeDict = new Dictionary(EncodeDict.Count);
foreach (var kvp in EncodeDict)
{
DecodeDict[kvp.Value] = kvp.Key;
}
}
}
2. 异常处理机制
添加输入验证和异常捕获:
public static string SafeEncode(string text)
{
try
{
if (string.IsNullOrWhiteSpace(text))
throw new ArgumentException("Input cannot be empty");
return Encode(text.ToUpperInvariant());
}
catch (Exception ex)
{
Console.WriteLine($"Encoding error: {ex.Message}");
return string.Empty;
}
}
五、完整示例:控制台应用程序
using System;
class Program
{
static void Main()
{
while (true)
{
Console.WriteLine("1. Encode\n2. Decode\n3. Exit");
var choice = Console.ReadLine();
switch (choice)
{
case "1":
Console.Write("Enter text: ");
var text = Console.ReadLine();
Console.WriteLine($"Morse: {MorseCodeConverter.Encode(text)}");
break;
case "2":
Console.Write("Enter morse code: ");
var morse = Console.ReadLine();
Console.WriteLine($"Text: {MorseCodeConverter.Decode(morse)}");
break;
case "3":
return;
default:
Console.WriteLine("Invalid choice");
break;
}
}
}
}
六、测试用例
[TestClass]
public class MorseTests
{
[TestMethod]
public void TestEncoding()
{
Assert.AreEqual(".- --- ...- .", MorseCodeConverter.Encode("AOV "));
Assert.AreEqual(".... . .-.. .-.. --- .-- --- .-. .-.. -..",
MorseCodeConverter.Encode("HELLO WORLD"));
}
[TestMethod]
public void TestDecoding()
{
Assert.AreEqual("SOS", MorseCodeConverter.Decode("... --- ..."));
Assert.AreEqual("CQ DE K1ABC",
MorseCodeConverter.Decode("-.-. --.- -.. . -.- .---- .- -... -.-."));
}
}
关键词:摩斯密码、C#实现、编码解码、NAudio音频、WPF界面、性能优化、单元测试
简介:本文详细介绍了使用C#(.NET)实现摩斯密码编码与解码的完整方案,包含基础字典映射、音频输出支持、WPF图形界面开发及性能优化策略,提供从控制台应用到单元测试的完整代码示例,适合通信软件开发者及无线电爱好者参考。