2014-10-06 50 views
1

嘿,我試圖製作一個程序,幫助人們使用凱撒移位密碼來加密郵件和解密郵件,我知道這可能已經完成了,但我想要自己去。同時替換字符

我一直遇到的問題是當涉及到加密文本。用戶選擇一個數字(在1-25之間),然後應用程序將改變對應於所選號碼的字母,例如,如果用戶輸入「HI」並選擇2,那麼兩個字符在字母輸出「JK」的兩個位置上移動。我的主要問題是替換字符雖然,主要是因爲我已經設置了該計劃,使其能夠加密大段的文字,因爲我的代碼是:

If cmbxKey.Text = "1" Then 
     If txtOutput.Text.Contains("a") Then 
      sOutput = txtOutput.Text.Replace("a", "b") 
      txtOutput.Text = sOutput 
     End If 

     If txtOutput.Text.Contains("b") Then 
      sOutput = txtOutput.Text.Replace("b", "c") 
      txtOutput.Text = sOutput 
     End If 
    End If 

這意味着,如果用戶輸入「HAY」它將它改爲「HBY」,然後由於第二條語句它會將它改爲「HCY」,但我只希望它被更改一次。任何建議,以避免這?謝謝你們

回答

2

既然你想要的所有字符轉移,通過循環儘管使用類似ToArray的人物開始了:

For each s as string in txtOutput.Text.ToArray 
    'This will be here for each character in the string, even spaces 
Next 

然後,而不是針對每一個字母的情況下,看它的ascii number

ACS(s) 

...並將其移動到您想要的數字。請記住,如果數字大於(我不知道您是否想要大寫/小寫)122,您想減去65讓您回到「A」。

然後你可以使用它轉換成字符:

CHR(?) 

所以這可能是這個樣子:

Dim sb as new text.StringBuilder() 
For each s as string in txtOutput.Text.ToArray 
    If asc(s) > 122 Then 
    sb.append(CHR(ASC(s) + ?YourShift? - 65) 
    Else 
    sb.append(CHR(ASC(s) + ?YourShift?) 
    END IF 
Next 
txtOutput.Text = sb.ToString 
0

一個非常簡單的改變您的應用程序,同時保持你的策略是方法用大寫字符替換小寫字符。然後他們不會再被Replace方法識別。

很明顯,問題在於你想要實現一個算法。一般來說,一個算法應該是聰明的,因爲你不必做繁重的工作。這就是爲什麼像史蒂夫介紹的方法更聰明的原因。它並不要求你分別映射每個字符,這很乏味,而且 - 作爲最枯燥的任務 - 容易出錯。

0

當您面對基本字母數字表無法處理的字符串時,會出現一個大問題。包含以下字詞的字符串: 「Déja vu」 - >「é」將會是什麼?

而且,如果您使用.ToUpper(),那麼如何編碼字符串「我是亞倫姆比利貝」。
.ToUpper返回「我是AARONMBILÉBÉ」。
你已經失去了外殼,你如何處理「É」的轉移?

當然,代碼應該像上面指出的那樣聰明,我只是通過使用System.Text.ASCIIEncoding來簡化處理。但從我開始使用大量的文本數據,網絡資源,文件(...)我不得不深入挖掘,以及編碼和解碼字符串時,認真考慮字符串編碼(和系統字節序的方式,向/從字節數組)

重新想起了什麼,你真的想在做結束。如果你是唯一使用你的代碼的人,並且你確定你只會使用A..Z,0..9,a..z,空格和固定數量的允許字符(比如puntuation)那麼,只需構建一個包含每個字符的表。

Private _AllowedChars As Char() = { "A"c, "B"c, ... "0"c, "1"c, .. "."c, ","c ... } 

Private _AllowedChars As Char() = "ABCDEF....012...abcd..xyz.;,?:/".ToCharArray() 

然後使用

Private Function ShiftChars(ByVal CurrentString As String, ByVal ShiftValue As Integer) As String 
    Dim AllChars As Char() = CurrentString.ToCharArray() 
    Dim FinalChars As Char() 
    Dim i As Integer 

    FinalChars = New Char(AllChars.Length - 1) {} ' It's VB : UpperBound is n+1 item. 
    ' so n items is UpperBound - 1 
    For i = 0 To AllChars.Length - 1 
     FinalChars(i) = _AllowedChars((Array.IndexOf(_AllowedChars, AllChars(i)) + ShiftValue) Mod _AllowedChars.Length) 
    Next 
    Return New String(FinalChars) 
End Function 

而且

Private Function UnShiftChars(ByVal CurrentString As String, ByVal ShiftValue As Integer) As String 
    ' ... the same code until : 
     FinalChars(i) = _AllowedChars((Array.IndexOf(_AllowedChars, AllChars(i)) - ShiftValue + _AllowedChars.Length) Mod _AllowedChars.Length) 
    ' ... 
End Function 

^^假設ShiftValue總是正的(定義一次)

但是,只有當您有一組預定義的允許字符時,這才起作用。如果你想要一個更靈活的工具,你應該開始處理編碼,字節數組,BitConverter,並看看系統的字節順序。這就是爲什麼我問,如果有人在goind使用你的應用程序:讓我們試試這個字符串:

"Xin chào thế giới" ' which is Hello World in vietnamese (Google Trad) 

在這種情況下,你可能放棄..?不!你永遠都有一招! >得到字符串編碼(移)

Private Function ShiftChars(ByVal CurrentString As String, ByVal ShiftValue As Integer) As String 
    Dim AllChars As Char() = CurrentString.ToCharArray() 
    Dim FinalChars As Char() 
    Dim i As Integer 

    ' Build your list of allowed chars... 
    _AllowedChars.Clear() 
    For i = 0 To AllChars.Length - 1 
     If Not _AllowedChars.ContainsKey(AllChars(i)) Then 
      _AllowedChars.Add(AllChars(i), AllChars(i)) 
     End If 
    Next 

    ' Then, encode... 
    FinalChars = New Char(AllChars.Length - 1) {} 
    For i = 0 To AllChars.Length - 1 
     FinalChars(i) = _AllowedChars.Keys.Item((_AllowedChars.IndexOfKey(AllChars(i)) + ShiftValue) Mod _AllowedChars.Count) 
    Next 
    Return New String(FinalChars) 
End Function 

同爲不印字/解碼 -
上飛

Private _AllowedChars As New SortedList(Of Char, Char) 

只需創建您的允許字符。
注意:在外語中,結果字符串是純垃圾,並且完全不可讀,除非您再次移動字符。

但是,此變通辦法的主要侷限性與上述固定字符數組相同:一旦您對字符串進行了編碼,並且在您的編碼字符串中添加了一個不存在於最初生成的允許字符中的字符,你的數據已經固化了,你將無法解碼你的字符串。你所擁有的只是純粹的垃圾。

所以有一天......也許有一天,您需要在定義的擴展編碼(Unicode/UTF8/16)中深入挖掘事物的字節級別,以確保數據的完整性。