1. 程式人生 > >Caesars Cipher

Caesars Cipher

而不是 區間 挑戰 aes glob rom 位置 密碼 ont

<-- 要求說明 -->

凱撒密碼

(讓上帝的歸上帝,凱撒的歸凱撒)

下面我們來介紹風靡全球的凱撒密碼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 對象。由於 fromCharCodeString 的靜態方法,所以應該像這樣使用: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的位置循環回來;

<-- 代碼實現 -->

function
rot13( 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