Проблема с юникодом .Net, наследие vb6

У меня есть процедура расшифровки в VB6. Теперь я хочу такую ​​же расшифровку на С#. Строки, которые необходимо расшифровать, находятся в юникоде, поэтому я использую Encoding.Unicode.GetString для чтения ввода на C#. Ввод теперь выглядит точно так же, как в VB6.

Первые несколько символов в цикле расшифровываются нормально! Затем я столкнулся с разницей... Программа анализирует символ '˜' с другим индексом, чем в VB6.

При отладке вижу в VB и .Net следующее:
VB6 ˜ = code 152
C# ˜ = code 732

Излишне говорить, что расшифровка не удалась. Мне нужно получить 152 для персонажа, упомянутого выше.

Что здесь не так?

С уважением,

Мишель


person Michel van Engelen    schedule 29.06.2009    source источник


Ответы (3)


Ваш VB6 не читал Unicode (я бы предположил, что это кодовая страница Windows-1252), поэтому он вернулся с другим кодом символа.

person Rowland Shaw    schedule 29.06.2009
comment
Спасибо за ответ, вы правы. На самом деле я забыл прочитать расшифровку с кодовой страницей 1252 в C #. - person Michel van Engelen; 29.06.2009

Что именно вы подразумеваете под «символом 152»? Как вы получили этот номер?

Обратите внимание, что «в Юникоде» может означать много разных вещей. Вы уверены, что он закодирован как UTF-16 в двоичных данных? Если бы вы могли написать больше об исходных данных, это было бы очень полезно.

Кроме того, шифрование и дешифрование почти всегда должны всегда выполняться с использованием байтов, а не символов. Хотя я понимаю, что вам нужно воспроизвести устаревшее поведение, вы должны попытаться со временем отказаться от обработки строк как непрозрачных двоичных данных.

person Jon Skeet    schedule 29.06.2009
comment
Вы конечно правы, но я пока не могу убедить своего босса создать вменяемую систему. (у меня получилось 152 при отладке в VB6) - person Michel van Engelen; 29.06.2009

Я делал это раньше. Проблема в вашей кодировке. Где .NET — юникод, VB6 — Unifail.

На стороне .NET вам нужно использовать Encoding.ASCII для преобразования ваших строк в массивы байтов и наоборот.

Encoding.ASCII.GetString(decrypted);
//and
Encoding.ASCII.GetBytes(cleartext);

Итак, когда вы шифруете для отправки в приложение VB, вы должны использовать ASCII.GetBytes, а затем зашифровать этот массив байтов, а когда вы получаете массив байтов со стороны VB, вы должны расшифровать их и использовать ASCII.GetString для декодирования байтов. в полезную строку.

person Community    schedule 29.06.2009
comment
Уилл, это действительно часть моего решения. Однако я использовал Unicode вместо ASCII. Мой шифр и зашифрованный текст не являются базовыми 64 или даже ниже ascii 128. - person Michel van Engelen; 29.06.2009