Одна большая проблема возникает, когда вы сталкиваетесь со строкой, которую базовая буквенно-цифровая таблица не может обрабатывать. Строка, которая содержит такие слова, как: «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), чтобы обеспечить целостность ваших данных.