Caesars Cipher
<-- 要求說明 -->
凱撒密碼
(讓上帝的歸上帝,凱撒的歸凱撒)
下面我們來介紹風靡全球的凱撒密碼Caesar cipher
,又叫移位密碼。
移位密碼也就是密碼中的字母會按照指定的數量來做移位。
一個常見的案例就是ROT13密碼,字母會移位13個位置。由‘A‘ ? ‘N‘, ‘B‘ ? ‘O‘,以此類推。
寫一個ROT13函數,實現輸入加密字符串,輸出解密字符串。
所有的字母都是大寫,不要轉化任何非字母形式的字符(例如:空格,標點符號),遇到這些特殊字符,跳過它們。
當你完成不了挑戰的時候,記得開大招‘Read-Search-Ask‘。
這是一些對你有幫助的資源:
- String.charCodeAt()
- String.fromCharCode()
<-- 個人理解 -->
首先,學習一下這兩種方法:
str.charCodeAt(index),返回值是一表示給定索引處(String中index索引處)字符的 UTF-16 代碼單元值的數字;如果索引超出範圍,則返回
NaN
。
String.fromCharCode(num1, ..., numN) ,
該方法返回一個字符串,而不是一個 String
對象。由於 fromCharCode
是 String
的靜態方法,所以應該像這樣使用:String.fromCharCode()
,而不是作為你創建的 String
對象的方法。
實現原理:
通過for循環,遍歷str的每一個字符,利用str.charCodeAt(index)獲取到每個字符的Unicode值,對Unicode的值進行-13的操作,將操作後的值傳入String.fromCharCode(num1,...,numN)獲取Unicode對應的字符值。
通過移位進行字母之間的轉有兩個特殊情況需要使用if進行處理:
1. 非A-Z的字符、空格的處理,即 Unicode>90 和 Unicoe<65 的情況;
2. Unicode值在65-77之間的字母,移位13個之後需要從Z的位置循環回來;
<-- 代碼實現 -->
functionrot13( str ){ var len = str.length; var arr = []; for(var i=0;i<len;i++){ if( str.charCodeAt( i ) < 65 || str.charCodeAt( i ) > 90){ arr.push( str[i] ); // 非A-Z的字符直接傳入空數組arr中 }else if( str.charCodeAt( i ) <=77 ){ arr.push( String.fromCharCode( str.charCodeAt( i )+13 ) ); // 這裏選擇+13的原因:一共是26個英文字母,在<=77的區間範圍內的字母,-13和+13都會循環到同一個字母 }else { arr.push( String.fromCharCode( str.charCodeAt( i )-13 ) ); } } return arr.join( ‘‘ ); }
Caesars Cipher