Проблема с .Net unicode, устаревший vb6
-
21-08-2019 - |
Вопрос
У меня есть процедура дешифрования в VB6.Теперь я хочу такую же расшифровку в C #.Строки, требующие расшифровки, находятся в юникоде, поэтому я использую кодировку.Юникод.getString для чтения входных данных в C #.Входные данные теперь выглядят точно так же, как в VB6.
Первые несколько символов в цикле расшифровываются нормально!Затем я сталкиваюсь с разницей...Программа анализирует символ " с другим индексом, чем в VB6.
При отладке я вижу следующее в VB и в .Net:
VB6 = код 152
C # = код 732
Излишне говорить, что расшифровка завершается неудачей.Мне нужно получить 152 для персонажа, упомянутого выше.
Что здесь не так?
С уважением,
Мишель
Решение
Ваш VB6 не читал Unicode (я бы предположил, что на кодовой странице Windows-1252), поэтому он возвращается с другим символьным кодом.
Другие советы
Что именно вы подразумеваете под "символом 152"?Откуда у вас этот номер?
Обратите внимание, что быть "в Юникоде" может означать много разных вещей.Вы уверены, что в двоичных данных он закодирован как UTF-16?Если бы вы могли опубликовать больше информации об исходных данных, это было бы очень полезно.
Кроме того, шифрование и дешифрование должны почти всегда должно быть выполнено с использованием байтов, а не символов.Хотя я понимаю, что вам нужно воспроизвести устаревшее поведение, вам следует попытаться со временем отказаться от обработки строк как непрозрачных двоичных данных.
Я уже делал это раньше.Проблема в вашей кодировке.Где .NET - это unicode, VB6 - это Unifail.
На стороне .NET вам необходимо использовать кодировку.ASCII для преобразования ваших строк в массивы байтов и наоборот.
Encoding.ASCII.GetString(decrypted);
//and
Encoding.ASCII.GetBytes(cleartext);
Итак, когда вы выполняете шифрование для отправки в приложение VB, вы должны использовать ASCII.Получите байты, а затем зашифруйте этот массив байтов, и когда вы получите массив байтов со стороны VB, вы должны расшифровать их и использовать ASCII.getString для декодирования байтов в полезную строку.