2014-09-23 169 views
23

我有以下C#代碼(來自我正在使用的庫)試圖找到比較指紋的證書。請注意,在以下代碼中,mycert.ThumbprintcertificateThumbprint都是字符串。爲什麼String.Equals返回false?

var certificateThumbprint = AppSettings.CertificateThumbprint; 

var cert = 
    myStore.Certificates.OfType<X509Certificate2>().FirstOrDefault(
     mycert => 
     mycert.Thumbprint != null && mycert.Thumbprint.Equals(certificateThumbprint) 
    ); 

這未能找到與指紋的證書,因爲mycert.Thumbprint.Equals(certificateThumbprint)false即使字符串相等。 mycert.Thumbprint == certificateThumbprint也返回false,而mycert.Thumbprint.CompareTo(certificateThumbprint)返回0

enter image description here

我可能會丟失一些東西很明顯,但我不明白,爲什麼Equals方法失敗。想法?

+15

這可能是一個奇怪的問題......但是每個字符串的長度都是一樣的嗎?(試圖查看是否有任何不可打印的字符)。 – vcsjones 2014-09-23 15:30:45

+5

從['string.CompareTo'](http://msdn.microsoft.com/en-us/library/fkw3h78a(v = vs.110).aspx)文檔:*字符集**包含可忽略的字符。* * CompareTo方法在執行文化敏感比較時不考慮這些字符。例如,如果以下代碼在.NET Framework 4或更高版本上運行,則將「動物」與「ani-mal」(使用軟連字符或U + 00AD)進行比較,表明這兩個字符串是等效的。 – 2014-09-23 15:33:40

+2

@Yuval你的引用似乎暗示着vcsjones懷疑的是什麼。 – 2014-09-23 15:35:20

回答

21

的CompareTo忽略某些字符:

static void Main(string[] args) 
{ 
    var a = "asdas"+(char)847;//add a hidden character 
    var b = "asdas"; 
    Console.WriteLine(a.Equals(b)); //false 
    Console.WriteLine(a.CompareTo(b)); //0 
    Console.WriteLine(a.Length); //6 
    Console.WriteLine(b.Length); //5 

    //watch window shows both a and b as "asdas" 
} 

(在這裏,字符添加到aU+034F,結合字形木)

Debug mode

那麼的CompareTo的結果是不是一個很好的指標Equals中的一個錯誤。您的問題最可能的原因是隱藏的字符。您可以檢查長度以確保。

請參閱this瞭解更多信息。

+0

確實,我在'certificateThumbprint'字符串的開頭有兩個U + 200E(從左到右的標記)字符。刪除,解決了這個問題。 – 2014-09-23 20:49:40

+0

所有的答案都是正確的。也有評論,也表明正確的問題,包括鏈接到這個問題http://stackoverflow.com/questions/11115511/how-to-find-certificate-by-its-thumbprint-in-c-sharp。我會將此標記爲已接受的答案。希望我也能做到這一點的意見。 – 2014-09-23 20:54:36

2

您可能希望嘗試使用String.Equals的過載,該過載接受StringComparison類型的參數。

例如:

myCert.Thumbprint.Equals(certificateThumbprint, StringComparison.[SomeEnumeration]) 


[SomeEnumeration]被替換爲以下枚舉常數之一:

- CurrentCulture 
- CurrentCultureIgnoreCase 
- InvariantCulture 
- InvariantCultureIgnoreCase 
- Ordinal 
- OrdinalIgnoreCase 


參考MSDN文檔發現hereenter image description here

+0

我試過'OrdinalIgnoreCase',結果是一樣的(即錯誤)。 – 2014-09-23 20:41:57

0

有時,當我們在數據庫中插入數據它存儲了一些空間,如「問題」。並且,當您嘗試將其與「問題」進行比較時,它將返回false。所以我的建議是:請檢查數據庫中的值或使用Trim()方法。

在你的情況,請嘗試: mycert.Thumbprint = NULL & & mycert.Thumbprint.trim()等於(certificateThumbprint.trim())

我覺得如果有的話,它將返回true!記錄將存在。

相關問題