今天是1024,程序员节那就干点儿程序员的事情。刚好,记得上高中时候,看过一部电影,无间道,里边黄秋生和梁朝伟用摩斯码通信,瞬间觉得好神秘,好帅气。最近闲来无事,出于对当初兴趣的尊敬,就顺手实现了一款简易的摩斯编解码器。
自己玩儿,暂定中文摩斯编码。基本思想是,将汉字对应的四位区位码数字分别编码为数字对应的摩斯码,一个中文对应20位摩斯码。解码过程逆向。
首先,项目结构图如下:
因为是个小工具,整个项目采用WPF实现。
主界面:
就核心过程而言,编码分两步:
1、汉字转区位码
此算法是直接抄的,原始出处,有点儿懒得费功夫找了,再次声明,不是在下原创。
/// <summary>
/// 汉字转区位码方法
/// </summary>
/// <param name="chinese">汉字</param>
/// <returns>区位码</returns>
public static string ChineseToCoding(string chinese)
{
string pCode = "";
byte[] pArray = new byte[2];
pArray = Encoding.GetEncoding("GB2312").GetBytes(chinese);//得到汉字的字节数组
int front = (short)(pArray[0] - '\0') - 160;//将字节数组的第一位160
int back = (short)(pArray[1] - '\0') - 160;//将字节数组的第二位160
pCode = front.ToString("D2") + back.ToString("D2");//再连接成字符串就组成汉字区位码
return pCode;
}
2、区位码转摩斯码
private static readonly Dictionary<string, string> _dictNumberMorse = new Dictionary<string, string>
{
{ "0", "— — — — —"},
{ "1", "· — — — —"},
{ "2", "· · — — —"},
{ "3", "· · · — —"},
{ "4", "· · · · —"},
{ "5", "· · · · ·"},
{ "6", "— · · · ·"},
{ "7", "— — · · ·"},
{ "8", "— — — · ·"},
{ "9", "— — — — ·"},
};
private static readonly Dictionary<string, string> _dictMorseNumber = new Dictionary<string, string>
{
{ "—————", "0"},
{ "·————", "1"},
{ "··———", "2"},
{ "···——", "3"},
{ "····—", "4"},
{ "·····", "5"},
{ "—····", "6"},
{ "——···", "7"},
{ "———··", "8"},
{ "————·", "9"},
};
public static string GBK2Morse(string gbkCode)
{
if (string.IsNullOrWhiteSpace(gbkCode) || gbkCode.Length != 4)
{
throw new ArgumentException($"{nameof(gbkCode)}非GBK区位码");
}
StringBuilder sbMorse = new StringBuilder();
foreach (var s in gbkCode)
{
sbMorse.Append(_dictNumberMorse[s.ToString()]).Append(" ");
}
return sbMorse.ToString();
}
github地址:https://github.com/KINGGUOKUN/MorseEncoder
/ · · · · · · · · · · — — — — — · · · — — / · · — — — — — — — — — — — · · · · · — — / · · — — — — — — · · · · · · · — — — — — /1024/ · · · — — · — — — — — — · · · — · · · · / · · · — — · · — — — · · · · · · · · · — /!
(大家猜出结语是啥了吗?)