Objective-C 入門指南 - 解碼

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




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


實際上我們需要用到巢狀迴圈 (nested loop) ,也就是在迴圈 (loop) 中有其他的迴圈,對單一英文句子而言,我們需要一個迴圈判斷每個字元是否為英文小寫字母,若是英文小寫字母,我們就需要另一個迴圈找出對應的索引值。由這樣的概念設計的解碼方法 (method) toDecode: ,如下
- (NSString *) toDecode: (NSString *) s
{
    NSString *r = @"";
    int number = [s length];
    char ct;
    int i, j;
    
    for (i = 0;i < number;i++) {
        ct = [s characterAtIndex: i];
        
        if (ct >= 97 && ct <= 122) {
            for (j = 0;j < 26;j++) {
                if (ct == [[cArray objectAtIndex: j] characterAtIndex: 0]) {
                    r = [r stringByAppendingString: [oArray objectAtIndex: j]];
                    break;
                }
            }
        }
        else {
            r = [r stringByAppendingFormat: @"%c", ct];
        }
    }
    
    return r;
}


巢狀迴圈是迴圈中包含另一個迴圈,由於我們利用縮排的方式編輯程式碼,看起來內層迴圈像是凹陷進去的巢,故稱之為巢狀迴圈。


toDecode: 與 toEncode: 相似,同樣需要一個 NSString 字串 (string) 當參數 (parameter) ,結果也回傳一個 NSString 字串。


解碼轉換由巢狀迴圈的部份來進行
for (i = 0;i < number;i++) {
    ct = [s characterAtIndex: i];
        
    if (ct >= 97 && ct <= 122) {
        for (j = 0;j < 26;j++) {
            if (ct == [[cArray objectAtIndex: j] characterAtIndex: 0]) {
                r = [r stringByAppendingString: [oArray objectAtIndex: j]];
                break;
            }
        }
    }
    else {
        r = [r stringByAppendingFormat: @"%c", ct];
    }
}


外層迴圈會依序取得英文句子的每個字元,然後判斷是否為英文小寫字母,如果該字元是英文小寫字母,就會啟動另一個迴圈找出表格中對應的索引值出來,相反地,如果該字元不是英文小寫字母,控制變數 i 就會自動遞增,然後判斷下一個字元。


注意,這個巢狀迴圈用了兩個 for 、兩個 if ,依順序 forifforif ,這是我們打算讓程式執行的順序,若是沒有依照這樣的順序,程式可能會跑出無法預期的結果。


Encrypt.m 需要加進 toDecode: ,然後我們用下面的 demo.m 進行測試
#import <Foundation/Foundation.h>
#import "Encrypt.h"

int main(int argc, char *argv[]) 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
    Encrypt *e = [[Encrypt alloc] initRandomEncrypt];
    NSString *s = @"There is no spoon.";
    NSString *r;
    NSString *o = @"\n\n";
    r = [e toEncode: s];
    o = [o stringByAppendingString: r];
    o = [o stringByAppendingString: @"\n\n"];
    o = [o stringByAppendingString: [e toDecode: r]];
    o = [o stringByAppendingString: @"\n\n"];
    NSLog(o);
 
    [pool drain];
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:demo.m
    功能:示範 Objective-C 程式 
    作者:張凱慶
    時間:西元 2012 年 7 月 */


Build and Go ,結果如下



我們先對 "There is no spoon." 進行編碼,然後解碼,結果無誤。接下來我們替 Encrypt 類別 (class) 設計圖形使用者介面 (graphical user interface) ,在此之前,先來認識 Cocoa吧!


中英文術語對照
解碼decoding
編碼encoding
索引值index
巢狀迴圈nested loop
迴圈loop
方法method
字串string
參數parameter
類別class
圖形使用者介面graphical user interface


您可以繼續參考
軟體開發


相關目錄
Objective-C 入門指南
Objective-C 教材
首頁



參考資料
Learning Objective-C: A Primer
The Objective-C Programming Language
Cocoa Fundamentals Guide
Coding Guidelines for Cocoa
Advanced Memory Management Programming Guide
Archives and Serializations Programming Guide

沒有留言: