
所謂的解碼也就是將編碼 (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() 一模一樣,除了把 cArray 與 oArray 的上下位置對調外。
我們把 encryptdemo3.php 修改如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | <?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 ); } } /* 《程式語言教學誌》的範例程式 檔名: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
沒有留言:
張貼留言