Fast Morse Code Encode And Decode
一.寫(xiě)在前面
現(xiàn)在UV段業(yè)余無(wú)線電已經(jīng)玩夠了,需要轉(zhuǎn)戰(zhàn)SW段了,要想在7050kHz上與HAM交流的話,就要學(xué)會(huì)普通話和常用標(biāo)準(zhǔn)縮略語(yǔ);如果想在7030kHz上與HAM通訊的話就要熟練掌握通用的摩爾斯電碼。
二.原理簡(jiǎn)介
首先通過(guò)兩個(gè)數(shù)組分別保存字符摩爾斯編碼和數(shù)字摩爾斯編碼如下:
先說(shuō)編碼,編碼比較簡(jiǎn)單,直接從輸入字符串中順序讀每一個(gè)字符然后判斷這個(gè)字符是數(shù)字還是英文字母直接就可以拿到這個(gè)字符對(duì)應(yīng)的摩爾斯電碼
編碼函數(shù)如下:
這里需要說(shuō)明的是在編碼過(guò)程中原文中的空格被編碼成’/’.
編碼比較簡(jiǎn)單,這里就不在多說(shuō)了。接下來(lái)看解碼部分:
剛開(kāi)始也是準(zhǔn)備直接用循環(huán)來(lái)挨個(gè)匹配;但后來(lái)感覺(jué)這樣效率實(shí)在是低!突然想到上次看到的一篇文章《一分鐘學(xué)會(huì)摩爾斯電碼》其中有這樣一張圖:

這是個(gè)樹(shù)啊啊?。。。。???NICE
那么直接構(gòu)建這棵樹(shù)用來(lái)查詢豈不美哉?
此部分是造樹(shù)函數(shù),傳入一個(gè)根節(jié)點(diǎn),由此根節(jié)點(diǎn)出發(fā)遍地開(kāi)花,造出一個(gè)二叉樹(shù)。戲說(shuō)不是胡說(shuō),這個(gè)函數(shù)可以分為兩個(gè)部分第一個(gè)for循環(huán)主要是遍歷存放英文字母編碼表ctable將編碼表中的英文字母掛到樹(shù)上;第二個(gè)for循環(huán)只要是遍歷數(shù)字編碼表ntable將編碼表中的數(shù)字掛到樹(shù)上。接下來(lái)我就挑選putCharNode()
函數(shù)展開(kāi)說(shuō)一下。
三個(gè)參數(shù) root 樹(shù)根;row表示是ctable中的第幾個(gè)編碼;col表是row對(duì)應(yīng)的編碼的第幾位。
分為五種情況:
1.讀到_ 并且此節(jié)點(diǎn)左子樹(shù)非空則遞歸 call putCharNode(root->left,row, ++col)
2.讀到_ 并且此節(jié)點(diǎn)左子樹(shù)空則先malloc新空間 然后 遞歸 call putCharNode(root->left,row, ++col)
3.讀到.并且此節(jié)點(diǎn)左子樹(shù)非空則遞歸 call putCharNode(root->right,row, ++col)
4.讀到.并且此節(jié)點(diǎn)左子樹(shù)空則先malloc新空間 然后 遞歸 call putCharNode(root->right,row, ++col)
5.讀到\0則表示此字符對(duì)應(yīng)的編碼讀取結(jié)束,要進(jìn)行字符掛樹(shù)操作,此時(shí)直接 root->data = 'A' + row
即可。
數(shù)字掛樹(shù)同理,接下來(lái)就是讀入摩爾斯電碼查樹(shù)即可得到譯碼結(jié)果:
譯碼函數(shù)傳入樹(shù)根root和摩爾斯電碼src;以空格鍵為分割將其放入temp數(shù)組中然后call findCode(root, temp,0)
函數(shù)進(jìn)行遞歸爬樹(shù)找到temp中摩爾斯電碼對(duì)應(yīng)的字符。
至此;此快速摩爾斯電碼編碼&&譯碼關(guān)鍵代碼已經(jīng)全部介紹完。
接下來(lái)看調(diào)用例子demo.c
編譯運(yùn)行結(jié)果如下(Windows GCC):
GitHub傳送:https://github.com/MichaelJiang1997/MorseCode