Подтвердить что ты не робот

String Equality - Что здесь происходит?

Чтобы отладить проблему в моем коде, я объявил следующие две строки, считая, что они будут эквивалентны:

String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
String newPrint = thumbprint.Trim().Replace(" ", "").ToUpper();

Я обнаружил, что это не так. Отлично, это источник моей проблемы. Тем не менее, я проверяю вещи в непосредственном окне (в строке после деклараций) и не понимаю, что происходит. Вот результат:

print
"8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
newPrint
"‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"
String.Compare(print, newPrint);
0
print == newPrint
false
print.Equals(newPrint)
false

а? Почему они не равны?

изменить:

Мне нужно использовать "отпечаток" в качестве базы. Пользователь вводит строку. Я просто использую "newPrint" в качестве временной переменной для удержания урезанного/выровненного значения. печать - ожидаемый результат.

4b9b3361

Ответ 1

Действительно, они не эквивалентны. Я скопировал два значения, а newPrint имеет длину 41, тогда как print имеет длину 40. Первый символ newPrint - это символ с значением ASCII 14. Интересно, что это было перенесено из вашего непосредственного окна к SO к моей LINQPad.

print.Length
40
newPrint.Length
41
(sbyte)print[0]
56
(sbyte)newPrint[0]
14

Это фактически не имеет ничего общего с вашими вызовами Trim и Replace, но с тем фактом, что вы используете thumbprint вместо print в качестве базы. Я могу только предположить, что thumbprint содержит этот дополнительный символ. Откуда я не знаю. Если вы измените вторую строку, чтобы использовать print вместо thumbprint, вы получите ожидаемый результат.

Ответ 2

Строки, которые вы публикуете, не равны. Просто сделайте следующее:

string val   = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717"; 
string val1  = "‎8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
var bt = System.Text.Encoding.UTF8.GetBytes(val);
var bt_1 = System.Text.Encoding.UTF8.GetBytes(val1);

Вы увидите, что второй массив содержит больше элемента в начале.

226 
128 
142

после этого содержимого 3 элементов равно.

Причина String.Compare работает:

Сравнение использует текущую культуру для получения специфических для культуры информации, такой как правила обсадной колонны и алфавитный порядок отдельные символы

Ответ 3

В вопросе есть что-то не так. Если нет, пл. укажите полную среду, как я пробовал это на MS.NET, но не на Mono. Попробуйте этот метод: - Я не получаю ошибок и вывод инструкции trace

Строки равны = True

void TestString()
{
    String print = "8A9B485ECDC56B6E0FD023D6994A57EEC49B0717";
    String newPrint = print.Trim().Replace(" ", "").ToUpper();
    Trace.TraceInformation("Strings are equal = {0}", (print == newPrint) && (print.Equals(newPrint)));
    Debug.Assert(print == newPrint);
    Debug.Assert(print.Equals(newPrint));
}