2014-08-25 8 views
0

Импорт Microsoft.VisualBasicкод Возвращает символы Unicode Как Преобразовать в ASCII

Public Class VigenereCipher 

    Public Shared Function Encrypt(ByVal cipherTxt As String, ByVal key As String) 
     Dim encryptedText As String = "" 
     For i As Integer = 1 To cipherTxt.Length 
      Dim temp As Integer = Asc(GetChar(cipherTxt, i)) _ 
            + Asc(GetChar(key, i Mod key.Length + 1)) 
      encryptedText += Chr(temp) 
     Next 
     Return encryptedText 
    End Function 

    Public Shared Function Decrypt(ByVal cipherTxt As String, ByVal key As String) 
     Dim decryptedText As String = "" 
     For i As Integer = 1 To cipherTxt.Length 
      Dim temp As Integer = Asc(GetChar(cipherTxt, i)) _ 
            - Asc(GetChar(key, i Mod key.Length + 1)) 
      decryptedText += Chr(temp) 
     Next 
     Return decryptedText 
    End Function 

End Class 

Я хотел бы программу, чтобы вернуться обычные символы, так как он выводит символы Юникода.

+0

Вы не можете хранить двоичные данные в строке, они будут уничтожены, когда строка будет нормализована, а ваш код сработает, когда он будет соответствовать одному из суррогатов. Использование Chr (temp) неверно, вам придется подумать об этом. –

ответ

1

Прямо из MSDN: Вы должны использовать Encoding.Convert метод

Пример кода (из MSDN):

Public Function UnicodeToAscii(Byval unicodeString as String) As String 


    Dim ascii As Encoding = Encoding.ASCII 
    Dim unicode As Encoding = Encoding.Unicode 
    ' Convert the string into a byte array. 
    Dim unicodeBytes As Byte() = unicode.GetBytes(unicodeString) 

    ' Perform the conversion from one encoding to the other. 
    Dim asciiBytes As Byte() = Encoding.Convert(unicode, ascii, unicodeBytes) 

    ' Convert the new byte array into a char array and then into a string. 
    Dim asciiChars(ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)-1) As Char 
    ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0) 
    Dim asciiString As New String(asciiChars) 
    Return asciiString 
End Function 
0

код работает отлично, так как я получил тот же самый простой текст после дешифровки: Выполнения шифрование кода с вводом Encrypt="abcdef" и key=""hxc" производит выход для temp следующим

когда

i=1 temp= 217 'Ù 
i=2 temp= 197 'Å 
i=3 temp= 203 'Ë 
i=4 temp= 220 'Ò 
i=5 temp= 200 'Ò 
i=6 temp= 206 'Î 

от дальнейшей проверки, я пришел к выводу, что ваш алгоритм будет генерировать значение, превышающее 150 для большинства входов. reference говорит, что расширенные коды ASCII (код символов 128-255) Существует несколько различных вариантов 8-разрядной таблицы ASCII. Нижеследующая таблица соответствует ISO 8859-1, также называемому ISO Latin-1. Коды 129-159 содержат расширенные символы Microsoft® Windows Latin-1.

Comclusion: Проблема получения символов Unicode, что алгоритм вы Ware выбор будет производить значение больше 127 для temp.

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