PHP 入門指南 - 解碼

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




所謂的解碼也就是將編碼 (encoding) 過的小寫英文字母回覆成原來的英文小寫字母,由上圖可以看出,我們儲存表格所用的陣列依索引值 (index) 可推回原來的英文小寫字母,這是說,索引值 0 為 'q' ,所以是將原本的 'a' 變成 'q' ,因此,解碼就是依索引值重新加上位移值即可。


同樣需要用到巢狀迴圈 (nested loop) ,也就是在迴圈 (loop) 中有其他的迴圈。對單一英文句子而言,我們需要一個迴圈判斷每個字元是否為英文小寫字母,若是英文小寫字母,我們就需要另一個迴圈找出對應的索引值。由這樣的概念設計的解碼方法 (method) toDecode() ,如下
public function toDecode($s) {
    $r = Array();
    $pattern = "/[a-z]/";
        
    for ($i = 0; $i < strlen($s); $i++) {
        if (preg_match($pattern, $s[$i])) {
            for ($j = 0; $j < 26; $j++) {   
                if ($s[$i] == $this->cArray[$j]) {
                    array_push($r, $this->oArray[$j]);
                    break;
                }
            }
        }            
        else {
            array_push($r, $s[$i]);
        }
    }
        
    return join($r);
}


幾乎跟 toEncode() 一模一樣,除了把 cArrayoArray 的上下位置對調外。


我們把 encryptdemo3.php 修改如下
<?php
echo "<br / >";
$e = new Encrypt;
echo "code: ";
for ($i = 0; $i < 26; $i++) {
    echo $e->cArray[$i];
}
echo "<br / >";
$input = "There is no spoon.";
echo "input : ".$input."<br / >";
$r1 = $e->toEncode("There is no spoon.");
echo "encode: ".$r1."<br / >";
$r2 = $e->toDecode($r1);
echo "decode: ".$r2."<br / >";
echo "<br / ><br / >";

class Encrypt {
    public $cArray = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
    public $oArray = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
    
    function __construct() {
        shuffle($this->cArray);
    }
    
    function toEncode($s) {
        $r = Array();
        $pattern = "/[a-z]/";
        for ($i = 0; $i < strlen($s); $i++) {
            if (preg_match($pattern, $s[$i])) {
                for ($j = 0; $j < 26; $j++) {   
                    if ($s[$i] == $this->oArray[$j]) {
                        array_push($r, $this->cArray[$j]);
                        break;
                    }
                }
             }            
            else {
                array_push($r, $s[$i]);
            }
        }
        
        return join($r); 
    }
    
    public function toDecode($s) {
        $r = Array();
        $pattern = "/[a-z]/";
        
        for ($i = 0; $i < strlen($s); $i++) {
            if (preg_match($pattern, $s[$i])) {
                for ($j = 0; $j < 26; $j++) {   
                    if ($s[$i] == $this->cArray[$j]) {
                        array_push($r, $this->oArray[$j]);
                        break;
                    }
                }
            }            
            else {
                array_push($r, $s[$i]);
            }
        }
        
        return join($r);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:encryptdemo4.php
    功能:示範 PHP 程式 
    作者:張凱慶
    時間:西元 2012 年 11 月 */
?>


我們來看看結果吧



編碼、解碼都沒問題了,但要 Encrypt 類別總是掛在程式裡總是不太好看,接下來,我們來組織程式碼檔案,將 Encrypt 分割到 encryptor.php 裡,再用 include() 函數引進測試!


中英文術語對照
解碼decoding
編碼encoding
索引值index
巢狀迴圈nested loop
迴圈loop
方法method


您可以繼續參考
網站篇


相關目錄
回 PHP 入門指南
回 PHP 教材
回首頁


參考資料
http://php.net/manual/en/language.oop5.php
http://www.php.net/manual/en/oop5.intro.php
http://www.php.net/manual/en/language.oop5.basic.php
http://php.net/manual/en/function.strlen.php
http://php.net/manual/en/function.preg-match.php
http://www.php.net/manual/en/function.join.php

沒有留言: