July 21, 2012

Rot13 Encoding Algorithm

Happy Hacking ခေါင်းစဉ်ဖြင့် မရေးဖြစ်ခဲ့သည်မှာ ကြာပြီဖြစ်သည်။ အလုပ်များလွန်း၍ စိတ်ရှုပ်လာသော အခါမျိုးတွင် ပေါ့ပေါ့ပါးပါး အလဂိုရီဇင်များအား ဂျာဗားဖြင့် ပြန်လည်ရေးသားချင်းသည် ကျွှန်တော့်အတွက်တော့ လွန်စွာကောင်းမွန်သော အပန်းဖြေနည်း တစ်ခုဖြစ်ပါသည်။ ဒီတစ်ခေါက်တော့ Encoding များတွင် အသုံးများသော Rot13 အလဂိုရီဇင် အကြောင်းကို လေ့လာရေးသားပါဦးမည်။

rot13 သည် ဆီးဇာစကားဝှက် (Caesar's cipher) အမျိုးအစား တစ်မျိုးဖြစ်ပါသည်။ ရောမဗိုလ်ချုပ် ဂျူလီယက် ဆီဇာက စတင် အသုံးပြုခဲ့ သောကြောင့် ဆီဇာစကားဝှက်ဟု အမည်ရခြင်းဖြစ်ပါသည်။ အသုံးပြုပုံမှာ စကားလုံးများတွင် ပါဝင်သော စာလုံးများအား ၃နေရာ ရွှေ့ခြင်းဖြင့် မှုရင်း စကားလုံးအား စကားဝှက်ဝှက်ခြင်း ဖြစ်ပါသည်။

Rot13 သည် Rotate 13 ၏ အတိုကောက် အခေါ်အဝေါ်ဖြစ်ပြီး၊ အင်္ဂလိပ်စာလုံး များအား ၁၃ နေရာ အနောက်သို့ရွှေ့ခြင်း အားဖြင့် စကားဝှက်ဖွဲ့ခြင်း ကိုဆိုလိုပါသည်။ ဤမှ ရိုးရှင်းသော အလဂိုရီဇင်ဖြစ်သော်လည်း လွယ်လင့်တကူ အသုံးပြုနိုင်ခြင်းတို့ကြောင့် Unix OS များတွင် Embedded Program အဖြစ်သော်၎င်း၊ PHP တွင် str_rot13 အဖြစ်၎င်း ပံ့ပိုးထားပါသည်။

အထက်ဖော်ပြပါပုံအတိုင်း rot13 တွင် အင်္ဂလိပ်စာလုံးများအား ၁၃ နေရာရွှေ့၍ စကားဝှက်လုပ်ထားခြင်းသာ ဖြစ်၏။ အင်္ဂလိပ်စာလုံးများသည် အားလုံး ၂၆လုံးရှိသောကြောင့် ၁၃ နေရာ နှစ်ခါရွှေ့ပါက မှုရင်းစာလုံးကို ပြန်ရရှိမည် ဖြစ်ပါသည်။ မှုရင်းစကားလုံးအား အလွယ်တကူ ပြန်လည်ဖော်ထုတ်နိုင်ခြင်း၊ Alphabet အပြင် ကိန်းဂဏာန်းများအား ပြောင်းလည်းမပေးနိုင်ခြင်းတို့ကြောင့် အားနည်းသော စကားဝှက်ဘာသာရပ် အနေဖြင့် ဖော်ပြလေ့ရှိပါသည်။ သို့ရာတွင် အလွယ်တကူ အသုံးပြုနိုင်ခြင်းတို့ကြောင့် သိပ်ပြီး အရေးမကြီးသော ဂိမ်းကဲ့သို့သော အပလီကေးရှင်းများတွင် အသုံးပြုလေ့ရှိပါသည်။ ကျွှန်တော်တို့ လက်တွေ့ ဂျာဗားဖြင့် ရေးကြည့်ပါဦးမည်။

Rot13String.java
public class Rot13String {
 
 private StringBuilder sb;
 
 public Rot13String(String str) {
  sb = new StringBuilder();
  if(null != str && !str.isEmpty()) {
   for(char c : str.toCharArray()) {
    sb.append(getRot13Char(c));
   }
  }
 }
 
 private char getRot13Char(char c) {
  if((c >= 'a' && c <= 'm') || (c >= 'A' && c <= 'M')) 
   c += 13;
  else if ((c >= 'n' && c <= 'z') || (c >= 'N' && c <= 'Z'))
   c -= 13;
  return c;
 }

 public String encode() {
  return this.sb.toString();
 }
 
 public static void main(String[] args) {
  // Origin
     String origin = "hello HELLO";
     System.out.println(origin);
     
     // Convert
     String conv = new Rot13String(origin).encode();
     System.out.println(conv);
     
     // Convert(Convert())
     System.out.println(new Rot13String(conv).encode());
    }
}
ဤ Rot13 အလဂိုရီဇင်၏ နမှုနာတွင် အဓိက အလုပ်လုပ်နေသည်မှာ စာကြောင်း ၁၄ ရှိ getRot13Char လုပ်ဆောင်ချက်ပင် ဖြစ်၏။ အကယ်၍ ပါရာမီတာဖြစ်သော c သည် a မှ m အထိ ဒါမှမဟုတ် A မှ M အထိဆိုပါက c အား ၁၃ပေါင်း၍၊ c သည် n မှ z ဒါမှမဟုတ် N မှ Z အထိဆိုပါက c အား 13 နှုတ်ပြီး အစားထိုးကာ c အား ရလဒ်အဖြစ် ပြန်ပေးနေခြင်းသာ ဖြစ်၏။

ကွန်စတရက်တာတွင် အန်ကုဒ်လုပ်ချင်သည့် စကားလုံးအား ပါရာမီတာအဖြစ်ရယူပြီး အတွင်းပိုင်း စာကြောင်း ၈ တွင် For ဝါကျဖြင့် Loop လုပ်ကာ စာလုံးတစ်လုံးခြင်းအား အထက်ပါ getRot13Char လုပ်ဆောင်ချက်ကို အသုံးပြု၍ အန်ကုဒ်လုပ်ကာ StringBuilder အော့ဘဂျက်တွင် ဖြည့်စွက်ထားပါသည်။ StringBuilder အော့ဘဂျက် sb သည် Member ကိန်းရှင်ဖြစ်ပြီး၊ ကွန်စတရက်တာအား စတင်လုပ်ဆောင်သည့် အခါတွင် အန်ကုဒ်လုပ်ပြီး စာလုံးများကို ဖြည့်စွက်ပြီး ဖြစ်နေပါမည်။ ထို့နောက်တွင် encode လုပ်ဆောင်ချက်ကို ခေါ်ယူပါက sb.getString() လုပ်ဆောင်ချက်ကို ခေါ်ယူပြီး တည်ဆောက်ထားသော စာကြောင်းအား ရလဒ်အဖြစ် ပြန်ပေးမည် ဖြစ်ပါသည်။

အသုံးပြုပုံမှာ main လုပ်ဆောင်ချက်အတွင်းတွင် ဖြစ်ပါသည်။ စာကြောင်း ၂၉တွင် မှုရင်းစာလုံးအား ရေးသားစေပါသည်။ တဖန် စာကြောင်း ၃၂ ဖြင့် မှုရင်းစာလုံးအား အန်ကုဒ်လုပ်ပြီး ရလဒ်အား စာကြောင်း ၃၃ တွင် ရေးသားစေပါသည်။ နောက်ဆုံးတွင် စာကြောင်း ၃၆ ဖြင့် အန်ကုဒ်လုပ်ထားသော စာလုံးအား ထပ်မံ အန်ကုဒ်လုပ်ကာ ရေးသားစေပါသည်။

အထက်ပါ နမှုနာအား အလုပ်လုပ်ကြည့်စေသောအခါ အောက်ပါအတိုင်း တွေ့မြင်ရမည် ဖြစ်ပါသည်။


မှုရင်းစာလုံးနှင့်အန်ကုဒ်လုပ်ထားသော စာလုံးအား အန်ကုဒ်လုပ်ထားသည့် စာလုံးသည် အတူတူဖြစ်သည်ကို တွေ့ရပါလိမ့်မည်။

လေးစားစွာဖြင့်။
မင်းလွင်

No comments:

Post a Comment