условие if истинно, но поток программы переходит к части else в vb

у меня проблема с фрагментом кода в vb.net. В этом поток управления переходит к условию else, даже если значение в if истинно.

Я использовал это как ввод: WD-WXK0AC9T7316 код:

Private Function EncryptHDKey(ByVal Hd_no As String) As String

       Dim EncryptedString As String = ""

        For Each ch As Char In Hd_no
            If ((ch >= "0" And ch <= "9") Or (ch >= "a" And ch <= "z") Or (ch >= "A" And ch <= "Z")) Then
                If (Convert.ToChar((Convert.ToInt16(ch) + 4)) > "9" And ch <= "9") Then
                    EncryptedString = EncryptedString + Convert.ToChar((Convert.ToInt16(ch) + 3) - Convert.ToInt16("9"))
                Else
                    If (Convert.ToChar((Convert.ToInt16(ch) + 4)) > "z" And ch <= "z") Then
                        EncryptedString = EncryptedString + Convert.ToChar(Microsoft.VisualBasic.Asc("a") + (Convert.ToInt16(ch) + 3) - Microsoft.VisualBasic.Asc("z"))
                    Else
                        If (Convert.ToChar(Convert.ToInt16(ch) + 4) > "Z" And ch <= "Z") Then
                            EncryptedString = EncryptedString + Convert.ToChar(Microsoft.VisualBasic.Asc("A") + (Convert.ToInt16(ch) + 3) - Microsoft.VisualBasic.Asc("Z"))
                        Else
                            EncryptedString = EncryptedString + Convert.ToChar(Convert.ToInt16(ch) + 4)
                        End If
                    End If
                End If
            Else
                EncryptedString = EncryptedString + ch
            End If
        Next
        Return (EncryptedString)
    End Function

У меня еще нет прав на загрузку скриншотов, поэтому я загрузил скриншот в это место. www(точка)freeimagehosting(точка)net/y6ea3


person user2617874    schedule 20.11.2013    source источник
comment
Пожалуйста, опубликуйте свой код.   -  person varocarbas    schedule 20.11.2013
comment
Какое условие If вызывает проблемы?   -  person Brian Hooper    schedule 20.11.2013
comment
третий If (Convert.ToChar(Convert.ToInt16(ch) + 4) › Z And ch ‹= Z) Then   -  person user2617874    schedule 20.11.2013
comment
Это просто неправильный способ, вы не можете сравнивать char с арифметическим знаком, или если это так, VS, вероятно, проверит его ascii. Например (ch >= "a" = False) when ch = "W"c   -  person Nadeem_MK    schedule 20.11.2013
comment
когда я проверяю это значение на вкладке просмотра vs2010, оно оценивается как истинное.   -  person user2617874    schedule 20.11.2013
comment
Арифметические сравнения между переменными типа char, которые вы выполняете, не имеют особого смысла. Вы соединяете буквы (маленькие и большие заглавные) и цифры. В идеале вы должны использовать такие функции, как Asc и Chr, для преобразования типов Char в эквивалент ASCII; хотя VB.NET имеет некоторую поддержку и без этого (-> исправление моего предыдущего утверждения).   -  person varocarbas    schedule 20.11.2013
comment
А почему это не будет правдой? Какие входы вы рассматриваете?   -  person varocarbas    schedule 20.11.2013
comment
я запустил это на вкладке часов Convert.ToChar(Convert.ToInt16(ch) + 4) › Z And ch ‹= Z   -  person user2617874    schedule 20.11.2013
comment
?! Каковы исходные данные и почему вы считаете, что поведение VB.NET неправильно?   -  person varocarbas    schedule 20.11.2013
comment
Позвольте мне выразить это по-другому: любой символ (буква или цифра) проходит через первое условие и, таким образом, If (Convert.ToChar((Convert.ToInt16(ch) + 4)) > "9" And ch <= "9") Then используется также для букв (что приводит к неожиданным результатам), а If (Convert.ToChar((Convert.ToInt16(ch) + 4)) > "z" And ch <= "z") Then используется как с цифрами, так и с большими буквами (которые следуют за буквой). другой порядок, чем маленькие заглавные буквы). Резюмируя: это условие более или менее похоже на ваш вопрос: бессмысленно (без обид)...   -  person varocarbas    schedule 20.11.2013
comment
Я добавил URL-адрес на скриншот. Это единственный вариант, который я получаю с моими текущими привилегиями. Пожалуйста посоветуй.   -  person user2617874    schedule 20.11.2013
comment
... если вы в чем-то не уверены, просто намерены избегать высокой гибкости VB.NET (это довольно опасно для не слишком осведомленных людей). Ожидаемые операции для символов (как вы их видите a, z или 9) одинаковы или различны. Любая арифметическая операция выполняется за счет их ASCII-кодов (упорядочивание всех символов путем сближения букв (маленьких и больших заглавных), символов и цифр вместе), поэтому следует использовать соответствующие функции, чтобы избежать недоразумений Asc и Chr. VB.NET позволяет вам делать bc ›= ac, но это просто ярлык для кодов ASCII.   -  person varocarbas    schedule 20.11.2013
comment
Не могли бы вы указать точный символ, провоцирующий эту ситуацию (не ожидайте, что мы проанализируем все символы в этой строке), чтобы мы могли попытаться воспроизвести эту проблему (в любом случае, вы должны иметь в виду, что то, что написано в комментариях ; этот код не имеет особого смысла и нечетко структурирован).   -  person varocarbas    schedule 20.11.2013
comment
это код для кейгена, для которого у меня нет документации..   -  person user2617874    schedule 20.11.2013
comment
Ссылка на разницу ASCII/Unicode, чтобы мои идеи были достаточно понятными: stackoverflow.com/questions/10361579/   -  person varocarbas    schedule 20.11.2013
comment
Я проверил эти условия и не могу воспроизвести то, что вы показываете (не в VS 2010); условие истинно, и код ведет себя так, как ожидалось (НЕ переходит к другому). В любом случае, кроме как дать возможность прояснить вещи (которые, с другой стороны, должны быть более или менее ясны), я не вижу смысла в этом коде и, следовательно, в трате ни секунды на его анализ.   -  person varocarbas    schedule 20.11.2013
comment
спасибо, что уделили свое время, но он по-прежнему ведет себя так же, я не могу опубликовать экран в этом вопросе, пожалуйста, взгляните на это www (точка) freeimagehosting (точка) сеть / y6ea3   -  person user2617874    schedule 20.11.2013
comment
Как говорится, я видел твою фотографию. Но я проверил ваши условия ch = Wc с условием, на которое вы жалуетесь, и я не могу воспроизвести то, что вы показываете на своей картинке (с VS 2010). Также имейте в виду, что крайне маловероятно (практически невозможно), что код не анализирует условие должным образом (и для этого ввода это условие должно быть истинным); может случиться так, что непосредственное окно, возможно, при очень специфических условиях (с использованием старого кода VB) может дать неверный результат; а вы утверждаете обратное! (немедленное окно правильное и условие неправильное)...   -  person varocarbas    schedule 20.11.2013
comment
... что кажется мне невозможным. Когда вы думаете, что условие пропущено, наиболее вероятным сценарием является то, что ваш анализ неверен; когда вы предоставляете графическое свидетельство такого явления... Я не знаю, что я могу сказать, кроме того, что условия являются одной из основных структур языка программирования, и их неточность на 100% будет иметь много последствий для надежности данного языка. Вы получили довольно много за то, что выдали (изначально ничего), просто намерены учиться на этом, начать этот код с нуля (написать его правильно) и давайте перестанем тратить время :)   -  person varocarbas    schedule 20.11.2013
comment
спасибо, вы правы, я преобразовал это из старого проекта vb, используя vs2010. так есть ли обновление, которое может решить мою проблему?   -  person user2617874    schedule 20.11.2013
comment
Пожалуйста, не поймите меня неправильно. Я сказал: я не могу воспроизвести вашу картинку с VS 2010 именно в ваших условиях. Кроме того, даже до того, как вы попробуете, то, что вы утверждаете (т. е. немедленное окно правильно, а код работает неправильно), практически невозможно; практически нет шансов, что условие не учитывается ИДЕАЛЬНО в данном языке программирования (и, по логике, в VB.NET). Непосредственное окно (то, что вы показываете на картинке) МОЖЕТ быть неправильным (при очень специфических условиях, которые НЕ происходят в вашем коде), но выполнение всегда будет правильным.   -  person varocarbas    schedule 20.11.2013
comment
спасибо, вы помогаете мне понять   -  person user2617874    schedule 20.11.2013
comment
Это хорошо работает и для меня. Вы должны отладить немного больше. Посмотрите на состояние внимательнее не только гл. например, посмотрите: asc(ch), asc(Z), Convert.ToInt16(ch) + 4   -  person the_lotus    schedule 20.11.2013


Ответы (1)


Это может быть далеко, но поскольку вы сказали, что конвертируете старый проект в VS2010, возможно, стоит попробовать.

Возможно проблема не в исходниках, а в самом окружении. Возможно, кодировка символов для более старого проекта отличается от той, что установлена ​​в VS2010. Я говорю это потому, что кодировка по умолчанию в VS2005 отличается от той, что установлена ​​в VS2010. В криптологии такие мелочи, как метаданные проекта, также играют свою роль, которую многие склонны упускать из виду, думая, что с их исходным кодом что-то не так.

Поэтому убедитесь, что конфигурация среды проекта такая же. Специальное кодирование (как указано @varocarbas). Поиграйте с ним некоторое время.

person Abhinav Kulshreshtha    schedule 20.11.2013