我在C#中遇到monotorrent问题。它会丢弃对等体,因为握手中的对等体ID不等于给定的跟踪器。
有问题的代码块如下所示:
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
为什么十六进制完全相同的字符串不被认为是相同的?
更新:跟踪器返回对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 :(得分:-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(), ...)
答案 1 :(得分:-1)
使用以下构造比较C#中的字符串:
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