java字串轉換的問題

我要做一個程式能夠讀取txt文字檔

然後在create另一個新的txt

可是中間需要encrypt

例如我原來的txt檔裡文字是Anglia

放進去讀以後new txt檔的文字

從Anglia------->natyvn

就是大寫的字母在ASCII碼裡都要加上45

小寫的字母加上13

我作了好久還是做不出來

有誰會的可以幫一下

Update:

你說的沒錯就是這個意思

像n的話超過z就會返回到a

是我沒說清楚

不好意思唷

Update 2:

那我如果要轉回去的話怎麼轉

你看Anglia-->natyvn

問題在A和a都是n

這樣我該怎麼解決呢

2 Answers

Rating
  • Jeremy
    Lv 4
    1 decade ago
    Favorite Answer

    public class Ex1 {

      public static void main(String[] args) {

        String msg = "Anglia";

        

        System.out.println("encrypt(" + msg + ") = " + encrypt(msg));

      }

      

      public static String encrypt(String msg)

          throws NullPointerException {

        StringBuffer sb = new StringBuffer(msg);

        char ch;

        

        for (int i = 0; i < sb.length(); i++) {

          ch = sb.charAt(i);

        

          if (Character.isUpperCase(ch)) {

            //大寫的字母在ASCII碼裡都要加上45

            ch += 45;

          } else if (Character.isLowerCase(ch)) {

            //小寫的字母加上13

            ch = (char)((ch - 'a' + 13) % 26 + 'a');

          } //else do nothing

          sb.setCharAt(i, ch);

        }

        return sb.toString();    

      }

    }

    2008-04-23 23:49:55 補充:

    上面程式碼空白的部份為 "全形字元",使用時請取代成 "半形空白" 或 tab

    2008-04-24 00:01:06 補充:

    >> 大寫的字母在ASCII碼裡都要加上45

    >> 小寫的字母加上13

    妳的條件不完整,

    將訊息加密後,可能無法解密回去!

    在這邊看來,

    A 變為 n 很正常

    但 n 變為 a 卻不正確,

    照理說字元 n 的ASCII碼 +13 後,怎麼可能會比 a 還要小???

    這邊我把它解讀成:

     

    當小寫的字元進行加密,如果ASCII碼超過上界 'z',則從頭 'a' 開始

    'a' = 97

    'z' = 122

    若 ch 為小寫字元,則 ch = (char) ( ((ch - 'a' ) + 13) % 26 + 'a')

    2008-04-24 00:01:16 補充:

    ch - 'a' 代表說平移到原點 0,即 ch 若等於 'a',則 ASCII 碼等於 0

    + 13 代表說編碼,即將 ASCII 碼 + 13

    % 26 代表說 ASCII 碼若超過區間 [0, 25] ,則從頭循環。

       也就是 26 將變為 0; 27 將變為 1; 28 將變為 2; 以此類推...

    + 'a' 代表說把 ASCII 碼平移回去

    2008-04-24 00:03:49 補充:

     

    可能會變成下列結果

    A → n

    B → o

    C → p

    D → q

    E → r

    F → s

    G → t

    H → u

    I → v

    J → w

    K → x

    L → y

    M → z

    N → a

    O → b

    P → c

    Q → d

    R → e

    S → f

    T → g

    U → h

    V → i

    W → j

    X → k

    Y → l

    Z → m

    2008-04-24 00:07:42 補充:

    a → n

    b → o

    c → p

    d → q

    e → r

    f → s

    g → t

    h → u

    i → v

    j → w

    k → x

    l → y

    m → z

    n → a

    o → b

    p → c

    q → d

    r → e

    s → f

    t → g

    u → h

    v → i

    w → j

    x → k

    y → l

    z → m

    2008-04-24 00:08:14 補充:

    執行結果:

    encrypt(Anglia) = natyvn

    請檢查看看是不是有少條件!!!

    2008-04-25 10:56:17 補充:

    //大寫的字母在ASCII碼裡都要加上45

    ch += 45;

    這邊有寫錯...要改成跟小寫一樣的用法

    ch += 32;

    ch = (char)((ch - 'a' + 13) % 26 + 'a');

    這邊的 ch += 32 是把 A~Z 映射到 a ~ z

    在用相同方法編碼...

    2008-04-25 10:57:21 補充:

    這種編碼方式是不可逆的!

    所以無法轉回去~

  • Inunu
    Lv 5
    1 decade ago

    轉換最後不該做 modulo, 導致現在你的輸入有 26x2 = 52 種 symbol, 但輸出卻被限制在 26 種 symbol. 這個對映本來就是單向 many-to-one.

    假如今天公雞能生蛋, 母雞也能生蛋. 我手上有一顆蛋, 請問它是公雞生的, 還是母雞生的?

    2008-04-28 12:34:48 補充:

    沒辦法, 你題目中的變換規則本來就會把 A-Z 與 a-z 導到 110~135 的數值範圍. 如果你的重點是在 A-Z a-z 的編碼, 不如像這樣直接弄個 1:1 的對映表格出來.

    http://dmm.tw/~kevpeng/ul/Enc.java

Still have questions? Get your answers by asking now.