c # одинаковые строки не считаются равными

1

У меня проблема с monotorrent в С#. Он удаляет сверстники, потому что идентификатор сверстника в рукопожатии не равен указанному трекеру.

Проблемный блок кода выглядит следующим образом:

    if (id.Peer.PeerId != message.PeerId)
    {
        Logger.Log(id.Connection, "HandShake.Handle - Invalid peerid");

        //Here is my debug:

        string hex = BitConverter.ToString(Encoding.Default.GetBytes(id.Peer.PeerId));
        Console.WriteLine("1: {0}", hex);
        string hex1 = BitConverter.ToString(Encoding.Default.GetBytes(message.PeerId));
        Console.WriteLine("2: {0}", hex1);
        if (hex == hex1)
        {
            Console.WriteLine("hex eq");
        }
        if (id.Peer.PeerId.Equals(message.PeerId))
        {
            Console.WriteLine("string eq");
        }
        throw new TorrentException("Supplied PeerID didn't match the one the tracker gave us");
    }

Он возвращает что-то вроде этого:

1: 2D-42-54-37-39-32-30-2D-78-3F-3F-3F-12-4C-24-3F-71-3F-3E-68
2: 2D-42-54-37-39-32-30-2D-78-3F-3F-3F-12-4C-24-3F-71-3F-3E-68
hex eq
1: 2D-42-54-37-39-32-30-2D-78-3F-3F-3F-12-4C-24-3F-71-3F-3E-68
2: 2D-42-54-37-39-32-30-2D-78-3F-3F-3F-12-4C-24-3F-71-3F-3E-68
hex eq

Почему строки, которые полностью идентичны в гексагоне, не считаются равными?

Обновление. Трекер возвращает ответ, чтобы объявить запрос (получить peers), закодированный в CP1251. Может ли это вызвать проблему?

Update2: Я думаю, причина в том, что флаговые коды som. Я добавил:

            var str = System.Text.Encoding.Default.GetString(Encoding.Default.GetBytes(id.Peer.PeerId));
            var str1 = System.Text.Encoding.Default.GetString(Encoding.Default.GetBytes(message.PeerId));

            if (id.Peer.PeerId.Equals(message.PeerId))
            {
                Console.WriteLine("string eq");
            }
            if (str.Equals(str1))
            {
                Console.WriteLine("str eq str1");
            }

и получил это:

1: 2D-55-54-33-34-32-30-2D-7E-7D-01-4B-3F-79-3F-3F-3F-1A-73-3F
2: 2D-55-54-33-34-32-30-2D-7E-7D-01-4B-3F-79-3F-3F-3F-1A-73-3F
hex eq
str eq str1
1: 2D-55-54-33-33-32-30-2D-5F-76-11-3F-3F-6E-3F-0A-3F-54-62-3F
2: 2D-55-54-33-33-32-30-2D-5F-76-11-3F-3F-6E-3F-0A-3F-54-62-3F
hex eq
str eq str1

очень интересно!

  • 0
    Что такое тип PeerId? Это байтовый массив? Вы не можете сравнивать байтовый массив напрямую!
  • 0
    id.Peer.PeerId и message.PeerId являются строками
Показать ещё 2 комментария
Теги:
string
hex
monotorrent

2 ответа

-1

Используйте следующую конструкцию для сравнения строк в С#:

if(String.Compare(id.Peer.PeerId, message.PeerId, StringComparison. InvariantCultureIgnoreCase) != 0) 
{ 

    // strings as different
}

Вы можете переключить StringComparison мере необходимости. Взгляните на эти параметры: http://msdn.microsoft.com/en-us/library/system.stringcomparison%28v=vs.110%29.aspx

  • 0
    if (String.Compare (id.Peer.PeerId, message.PeerId, StringComparison.InvariantCultureIgnoreCase) == 0) {Console.WriteLine ("String.Compare equal!"); } - не работает :(
  • 0
    Нет, это написано != , А не == .
Показать ещё 1 комментарий
-1

Когда дело доходит до сравнения строк, я всегда использую Trim() обе строки и использую метод String.Equals(). Если сравнение не чувствительно к регистру, то я также использую метод ToLower() перед началом сравнения.

http://msdn.microsoft.com/de-de/library/t4411bks%28v=vs.110%29.aspx

Boolean StringsAreEqual = String.Equals(String1.Trim().ToLower(), String2.Trim().ToLower(), ...)
  • 2
    Если бы начальные / конечные пробелы и нижний / верхний регистр имели место, шестнадцатеричный код был бы другим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню