欢迎光临散文网 会员登陆 & 注册

Fast Morse Code Encode And Decode

2022-05-17 21:45 作者:计算机入门  | 我要投稿

一.写在前面

现在UV段业余无线电已经玩够了,需要转战SW段了,要想在7050kHz上与HAM交流的话,就要学会普通话和常用标准缩略语;如果想在7030kHz上与HAM通讯的话就要熟练掌握通用的摩尔斯电码。

二.原理简介

首先通过两个数组分别保存字符摩尔斯编码和数字摩尔斯编码如下:

先说编码,编码比较简单,直接从输入字符串中顺序读每一个字符然后判断这个字符是数字还是英文字母直接就可以拿到这个字符对应的摩尔斯电码

编码函数如下:

这里需要说明的是在编码过程中原文中的空格被编码成’/’.

编码比较简单,这里就不在多说了。接下来看解码部分:

刚开始也是准备直接用循环来挨个匹配;但后来感觉这样效率实在是低!突然想到上次看到的一篇文章《一分钟学会摩尔斯电码》其中有这样一张图:

这是个树啊啊啊!!!???NICE

那么直接构建这棵树用来查询岂不美哉

此部分是造树函数,传入一个根节点,由此根节点出发遍地开花,造出一个二叉树。戏说不是胡说,这个函数可以分为两个部分第一个for循环主要是遍历存放英文字母编码表ctable将编码表中的英文字母挂到树上;第二个for循环只要是遍历数字编码表ntable将编码表中的数字挂到树上。接下来我就挑选putCharNode()函数展开说一下。

三个参数 root 树根;row表示是ctable中的第几个编码;col表是row对应的编码的第几位。

分为五种情况:

1.读到_ 并且此节点左子树非空则递归 call putCharNode(root->left,row, ++col)

2.读到_ 并且此节点左子树空则先malloc新空间 然后 递归 call putCharNode(root->left,row, ++col)

3.读到.并且此节点左子树非空则递归 call putCharNode(root->right,row, ++col)

4.读到.并且此节点左子树空则先malloc新空间 然后 递归 call putCharNode(root->right,row, ++col)

5.读到\0则表示此字符对应的编码读取结束,要进行字符挂树操作,此时直接 root->data = 'A' + row即可。

数字挂树同理,接下来就是读入摩尔斯电码查树即可得到译码结果:

译码函数传入树根root和摩尔斯电码src;以空格键为分割将其放入temp数组中然后call findCode(root, temp,0)函数进行递归爬树找到temp中摩尔斯电码对应的字符。

至此;此快速摩尔斯电码编码&&译码关键代码已经全部介绍完。

接下来看调用例子demo.c

编译运行结果如下(Windows GCC):


GitHub传送:https://github.com/MichaelJiang1997/MorseCode


Fast Morse Code Encode And Decode的评论 (共 条)

分享到微博请遵守国家法律