Swift 入門指南 V1.00 - 單元 19 - 解碼




解碼 (decoding) 需要用到與編碼相同的轉換表格



解碼也就是把編碼 (encoding) 過程反過來,如上圖原本的 'h' 編碼成了 'b' ,然後 'e' 編碼成了 'a' 等等,現在是要把 'b' 變回 'h''a' 變回 'e'


實際上我們的表格是餘數陣列 (array) ,這裡仍是採字元的方式講解。

例如上一個單元編碼過的字串


"Tinan ph yf huffy."

同樣的,我們用迴圈 (loop) 逐一檢查每個字元,以 isLowercase() 判斷該字元是否為英文小寫字母,如果是英文小寫字母就進行解碼轉換,第一步是要找到該字元在餘數陣列中的索引值,這項工作交給 findCodeIndex() 來完成


// 由字元從密碼表中找到索引值
func findCodeIndex(chr: Character) -> Int {
   var n = findAlphabetIndex(chr)
   var i = 0
   for d in code {
      if d == n {
         return i
      }
 
      i++
   }
 
   return -1
}

完整程式請參考「範例程式篇」的 Encrypt.swift

findCodeIndex() 先找到檢測字元在字母表中的序數,然後比對密碼表餘數陣列的元素值,找到相同的就回傳索引值,接著再透過 findLetter() 取得字母表中對應的字元


// 由索引值找到字母表中對應的字元
func findLetter(index: Int) -> Character {
   var i = 0
   for s in alphabet {
      if i == index {
         return s
      }
 
      i++
   }
 
   return Character("")
}

toDecode() 的設計跟 toEncode() 類似,如下


// 進行解碼的方法
func toDecode(str: String) -> String {
   var newStr = ""
   for chr in str {
      if isLowercase(chr) {
         newStr.append(findLetter(findCodeIndex(chr)))
      }
      else {
         newStr.append(chr)
      }
   }
   return newStr
}

延續上一個單元的測試,在 Playground 的結果如下



編碼與解碼功能大體完備,下一個單元我們開始離開 Playground ,改用命令列專案來執行 Encrypt 類別。


中英文術語對照


解碼decoding
編碼encoding
陣列array
迴圈loop

1 則留言:

匿名 提到...

Sands Casino
The Sands Casino is a casino located in 카지노사이트 San Francisco, CA. It 인카지노 has a total of 650 slot machines, over 30 table games, a variety septcasino of live table games,