2014-10-06 2 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 

Это означает, что если пользователь вводит «АЙ» его изменит его на «HBY», а затем из-за второго оператора if он изменит его на «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 возвращает «I'A AARON MBILÉBÉ».
Вы потеряли корпус, и как вы справляетесь с переключением «É»?

Конечно, код должен быть умным, как указано выше, и я был использован, чтобы иметь дело со строками, просто используя System.Text.ASCIIEncoding, чтобы упростить задачу. Но с того момента, как я начал использовать большое количество текстовых данных, источники из Интернета, файлы (...) Я был вынужден копать глубже, и серьезно рассмотреть строку, закодированную (и системы порядка байтов, кстати, при кодировании и строка декодирования в/из массива байтов)

Re-думать о том, что вы действительно хотите в конец. Если вы используете код только один, и вы уверены, что используете только 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 _AllowedChars As New SortedList(Of Char, Char) 

-> получить строку для кодирования (сдвиг)

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 

То же самое для Unshift/декодировании.
Примечание: на иностранных языках результирующая строка является чистым мусором и полностью нечитаема, если вы (un) не измените символы.

Однако основное ограничение этого обходного пути такое же, как и массив фиксированных символов выше: как только вы закодируете свою строку и добавите символ в свою закодированную строку, которая не существует в начальных разрешенных символах, тогда вы 've nuked ваши данные, и вы не сможете декодировать свою строку. Все, что у вас есть, - это чистый мусор.

Итак, однажды, возможно, вам придется углубиться на уровень байта вещи в определенной расширенной кодировке (Unicode/UTF8/16), чтобы обеспечить целостность ваших данных.

Смежные вопросы